Dzisiaj uczyłem kilku przyjaciół, jak używać C structs. Jeden z nich zapytał, czy możesz zwrócić a structz funkcji, na co odpowiedziałem: „Nie! Zamiast tego zwróciłbyś wskaźniki do dynamicznie mallocedytowanych structs”.
Pochodząc od kogoś, kto zajmuje się głównie C ++, spodziewałem się, że nie będę w stanie zwrócić structs przez wartości. W C ++ możesz przeciążać operator =for swoje obiekty i ma sens posiadanie funkcji zwracającej obiekt według wartości. Jednak w C nie masz tej opcji, więc pomyślałem, co właściwie robi kompilator. Rozważ następujące:
struct MyObj{
double x, y;
};
struct MyObj foo(){
struct MyObj a;
a.x = 10;
a.y = 10;
return a;
}
int main () {
struct MyObj a;
a = foo(); // This DOES work
struct b = a; // This does not work
return 0;
}
Rozumiem, dlaczego struct b = a;nie powinno działać - nie możesz przeciążać operator =swojego typu danych. Jak to się a = foo();dobrze komponuje? Czy to oznacza coś innego niż struct b = a;? Może pytanie, które należy zadać, brzmi: co dokładnie robi returnstwierdzenie w połączeniu ze =znakiem?
[edytuj]: Ok, właśnie wskazano mi struct b = ato błąd składniowy - to prawda i jestem idiotą! Ale to sprawia, że jest to jeszcze bardziej skomplikowane! Używanie struct MyObj b = arzeczywiście działa! Czego tu brakuje?
struct MyObj b = a;wydaje się, że działa :)
struct b = a;jest błędem składniowym. A co jeśli spróbujeszstruct MyObj b = a;?