Чи може main () повернути структуру?

Вчора в інтерв'ю мені було запропоновано одне запитання: main return struct ? Я не знаю, може хто-небудь, будь ласка, скажіть мені, це можливо чи ні, якщо так, то чому?

2
чому я ніколи не отримую таких питань, як цей, коли я отримую інтерв'ю? :)
додано Автор zmo, джерело
Що таке structure ?
додано Автор SheetJS, джерело
@ Нірк так структура
додано Автор Varun Chhangani, джерело

7 Відповіді

main can only return an int value in C (at least for hosted implementations).

12
додано
exit і повернення з основного не зовсім еквівалентні. Якщо ви називаєте exit , обробники atexit можуть отримати доступ до об'єктів, що тривають автоматично, з первинного виклику функції main та будь-яких інших функцій викликів які ще не повернулися. Якщо ви return з main , термін дії цих об'єктів вже закінчився, і ви не можете отримати доступ з обробників atexit . Крім того, якщо ви називаєте setbuf або setvbuf на будь-яких потоках з буфером, що має автоматичну тривалість зберігання, повернення з main викликає UB, але викликає < код> вихід не має.
додано Автор R.., джерело
Це не говорить, що виклик виходу еквівалентно поверненню з основного. Вона говорить, що повернення з основного еквівалентно виклику exit з значенням, яке повернуто з основного. Зверніть увагу на те, що слово "повернуто" означає, що повернення вже відбулося в той момент, коли дію, еквівалентну виклику exit , відбувається. І як завжди, одним з ефектів return є закінчення терміну служби автоматичних об'єктів.
додано Автор R.., джерело
@VarunChhangani exit (a); і return a; в main еквівалентні.
додано Автор ouah, джерело
@ R .. Ярлик у моєму коментарі був занадто коротким, спасибі за виправлення.
додано Автор ouah, джерело
@R .. Дякую за пояснення, дуже легко пропустити.
додано Автор effeffe, джерело
@ R .. +1 для цікавих точок, але чому стандарт чітко каже, що вони еквівалентні? (5.1.2.2.3/1)
додано Автор effeffe, джерело
як щодо виходу заяви?
додано Автор Varun Chhangani, джерело

Розділ 5.1.2.2.1 стандарту С каже:

Функція, викликана при запуску програми, називається main. The   реалізація не оголошує жодного прототипу для цієї функції. Це має бути   визначений тип повернення int та без параметрів:

  int main (void) {/ * ... * /}
 
     

або з двома параметрами (називаються тут як argc і argv, хоча будь-який   імена можуть бути використані, оскільки вони локальні для функції, в якій вони є   заявив):

  int main (int argc, char * argv []) {/ * ... * /}
 
     

або еквівалент;) або в якомусь іншому варіанті виконання

6
додано
Реалізація може визначати додаткові підписи для main , але вона повинна документувати ці додаткові підписи. Якщо документація не містить її, вона не підтримується.
додано Автор John Bode, джерело
Як визначена реалізація означає не ?
додано Автор effeffe, джерело
Хм, це можливо, але це не так вже й добре (ну, принаймні для не англійця, як я). У будь-якому випадку, стандарт явно говорить про різні типи повернення для main , говорячи, що поведінка не є невизначеною.
додано Автор effeffe, джерело
ІМХО, "визначено виконанням", належить аргументам у другому вигляді
додано Автор sasha.sochka, джерело

Ні, ви не можете

Якщо тип повернення основної функції є типом, сумісним з int   повернення від початкового дзвінка до основної функції еквівалентно   викликаючи функцію виходу із значенням, повернутим основною функцією   як аргумент; 10) досягнення того, що закінчує основну функцію   повертає значення 0. Якщо тип повернення не сумісний з int,   статус припинення, який повернуто до середовища хоста, є   не вказано.

І ви не можете передати структуру до основного, тому краще записати цю структуру до бінарного файлу. Що ти хочеш зробити?

Edit (for @effeffe):

#include 

struct st{float f;};

int main(void)
{
    struct st x;
    x.f = 3.14;
    return x;
}

Повертає

demo.c: In function ‘main’:
demo.c:9:5: error: incompatible types when returning type ‘struct st’ but ‘int’ was expected
2
додано
оххх, так, тепер я вас розумію (цитований текст говорить про декларацію в int main , а не про зворотне значення), ВИ ВАЖЛИВА!
додано Автор Keine Lust, джерело
Може, вам все одно, але компілятор робить, див. Редагування
додано Автор Keine Lust, джерело
Якщо тип повернення не сумісний з int, статус припинення, який повернуто до середовища хосту, не вказано.
додано Автор Keine Lust, джерело
Я не розумію, що це пов'язано з питанням? Цей код намагається повернути значення типу, яке несумісно з оголошеною формою повернення функції, і це завжди помилково. Стандарт, який ви цитував, говорить Якщо тип повернення не сумісний з int ... , а не Якщо значення поверненого типу не сумісні з int ... . Це говорить про декларований тип повернення функції, а не про фактичний тип значення в операторі return .
додано Автор effeffe, джерело
Так, і якщо нам це не хвилює, чому ми не можемо це зробити?
додано Автор effeffe, джерело
Де це цитата сказати, що ми можемо це зробити? Хіба це не просто сказати, що в такій ситуації ми б не знали повернутого статусу? (що, звичайно, непогано)
додано Автор effeffe, джерело

Жарт відповідь:

Багато людей кажуть ні, але я думаю так! (Різновид)

Ви можете повернути 32-розрядний покажчик, який ви потім перекидаєте до int, що вказує на структуру на купі, якщо вбудований розмір 32 біт, а у вас 32-бітна система, так що покажчик має розмір 32 біт також.

Тоді, досить небезпечно, сподіваюсь, що операційна система не виділить цю пам'ять іншою програмі для використання, і сподіваюся, що програма не перезаписує її. Якщо ви використовуєте OS, як Windows або Linux, то моє розуміння, навіть якщо ви не вільні пам'ять, то OS все це звільнить для вас. (Хоча ви завжди повинні вільно пам'ятати, звичайно, ще брудний програміст!)

Наскільки я знаю, інша програма може оголосити вказівник на розташування, яке повернуто вашим основним (), а потім прочитати вміст того, що було (байдуть) байт структури (тепер вже не було).

Я думаю, що це має працювати? Час перевірити це! (Це може здатися жахливо неправильним, і може статися багато невизначених речей.)

Не візьміть цю відповідь надто серйозно. Ви, на вашу думку, зруйнуєте ваші шанси зайнятості.

0
додано

Як інші відзначили, якщо повернення значення main не є типом, сумісним з int , його значення є "не вказано". Це означає, що компілятор може робити лише щось, що йому подобається, при поверненому значенні без порушення стандарту C, і неможливо, щоб портативна C програма повернула тип структури. З іншого боку, нічого в стандарті C вимагає, щоб постачальники компілятора не документували, що станеться, якщо код намагатиметься повернути тип структури main , а також не вимагає, щоб документована поведінка компілятора ніколи не була корисною . Якщо в ОС були змінні primaryReturnCode та secondaryReturnCode , а постачальник компілятора хотів вказати, що повернення структури, що містить два значення int , призведе до першого значення буде збережено в primaryReturnCode , а другий в secondaryReturnCode , така специфікація буде абсолютно законною.

У C ++ програма повинна мати функцію main , яка повертає int . Можна також мати інші функції з назвою main , які повертають інші речі. Я не знаю, чи функція, яка отримала назву main , але мала різні параметри, і тип повернення з функції запуску main може з'явитися в тому ж контексті, що і початковий, але якщо в рамках класу не повинно бути допустимих нічого іншого, що називається main .

0
додано

main can only return int in C/C++. This has to do with the ability to return a status code when a program has completed. 0 means success while 1 through 255 meant a particular error. Program would come would some sort manual in a text file or in print that would have the meaning of those errors so you could determine why your program couldn't run. This is assuming someone went through the effort of error checking and produced documentation.

0
додано

Оскільки основний спочатку викликаний з програми завантажувача операційної системи, він не матиме жодного уявлення про те, що ви повертаєте, або про те, що з ним має бути зроблено.

Тому конвенція: повертає ціле число. Незалежно від того, яка мова або яка програма, це забезпечує загальний інтерфейс для програм для спілкування з оболонкою, що запускає її. Це також означає, що нетехнічні користувачі, які записують скрипти, можуть використовувати це ціле число для прийняття рішень у своїх сценаріях.

Найпростіший спосіб виконувати те, що ви задаєте, - зберегти структуру у файлі. Таким чином, будь-яка програма, яка знає дані вашої структури, може отримати доступ до файлу.

0
додано
Головне не викликається з програми завантажувача ОС. Насправді це навіть не перший код, виконаний після запуску вашої програми. Докладніше див тут stackoverflow.com/ питання/4783404/& hellip;
додано Автор sasha.sochka, джерело
Я не писав паперу про структуру ОС. Коли людина запитує, чи зможуть вони повернути структуру з головного, я припускаю, що вони не дуже технічні. О, і все, так, це так. Що ще може бути виконано головним чином? Спіральний друк?
додано Автор user2513931, джерело