Сьогодні я навчав пару друзів, як користуватися C structs. Один із них запитав, чи можете ви повернути функцію structз функції, на що я відповів: "Ні! Натомість ви повернете вказівники на динамічне mallocредагування structs".
Походячи від того, хто в основному робить C ++, я очікував, що не зможу повернути structзначення за значеннями. У C ++ ви можете перевантажувати operator =об'єкти для своїх об'єктів і має повний сенс мати функцію повернення об'єкта за значенням. Однак у C у вас немає такого варіанту, і тому я задумав, що насправді робить компілятор. Розглянемо наступне:
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;
}
Я розумію, чому struct b = a;не слід працювати - ви не можете перевантажувати operator =свій тип даних. Як це a = foo();складати штрафи? Це означає щось інше, ніж struct b = a;? Можливо, питання, яке потрібно задати, таке: що саме робить returnзаява спільно з =підписом?
[редагувати]: Гаразд, мені щойно вказали struct b = a- це синтаксична помилка - це правильно, і я ідіот! Але це ще більше ускладнює! Використання struct MyObj b = aсправді працює! Що я тут пропускаю?
struct MyObj b = a;здається, що це працює :)
struct b = a;- синтаксична помилка. Що робити, якщо спробуватиstruct MyObj b = a;?