Негізгі () қайтару құрылымы бола ма?

Кеше әңгімелесуге маған main 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 функциясының бастапқы шақыруынан және кез-келген басқа функцияның әлі қайтарылмаған. Егер сіз негізгі кодын қайтаратын болсаңыз, бұл нысандардың мерзімі біткен және atexit өңдегіштерінен қатынаса алмайсыз. Сондай-ақ, автоматты түрде сақтау уақытына ие аралықпен кез келген ағындарда setbuf немесе setvbuf деп атасаңыз, main код> шығу жоқ.
қосылды автор R.., көзі
Ол шақырудың шығуы бастыдан оралуына тең деп айтылмайды. Негізгіден қайтару бастыдан қайтарылған мәнімен шығуға шақыру болып табылады. Ескерту: «қайтарылған» сөзі exit қоңырауына баламалы әрекет орын алған кезде қайтару орын алғанын білдіреді. Және әрдайым, return әсерінің бірі - бұл автоматты нысандардың қызмет ету мерзімі аяқталады.
қосылды автор R.., көзі
main ішіндегі @VarunChhangani exit (a); және қайтаратыны; бірдей.
қосылды автор ouah, көзі
@R .. Пікірімдегі таңбаша тым қысқа болды, түзетулер үшін рақмет.
қосылды автор ouah, көзі
@R .. түсініктеме бергеніңіз үшін рахмет, өте оңай жібере алмайсыз.
қосылды автор effeffe, көзі
@R .. +1 қызықты ұпайлар үшін, бірақ неге стандартты олар эквивалентті деп айтады? (5.1.2.2.3/1)
қосылды автор effeffe, көзі
exit statement туралы не ???
қосылды автор Varun Chhangani, көзі

C стандартының 5.1.2.2.1-бөлімінде:

Бағдарламаны іске қосу кезінде шақырылған функция негізгі деп аталады. The   бұл функцияның прототипі жоқ. Бұл болады   int параметрінің қайтару түрімен және параметрлері жоқ:

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

немесе екі параметрлермен (мұнда argc және argv деп аталады, дегенмен)   атаулары пайдаланылуы мүмкін, себебі олар жергілікті функция болып табылады   мәлімделген):

  int main (int арг, char * argv []) {/ * ... * /}
 
     

немесе эквивалентті) немесе басқа да іске асыру әдісімен

6
қосылды
Іске асыру main үшін қосымша қолтаңбаларды анықтай алады, бірақ ол қосымша қолтаңбаларды құжаттауы керек. Егер құжаттама оны тізімдемесе, ол қолдау көрсетілмейді.
қосылды автор John Bode, көзі
іске қосу-анықталған жоқ дегенді білдіреді?
қосылды автор effeffe, көзі
Хм, бұл мүмкін, бірақ ол соншалықты айқын емес (жақсы, кем дегенде, мен сияқты ағылшын емес адам). Қалай болса да, стандартты main үшін түрлі қайтару түрлері туралы айқындауға болады, бұл мінез-құлықтың анықталмағанын айтады.
қосылды автор effeffe, көзі
IMHO, «implementation-defined» 2-пішінде аргументтерге жатады
қосылды автор sasha.sochka, көзі

Жоқ, сіз алмайсыз

Егер негізгі функцияның қайтару түрі int типіне сай болса,   бастапқы қоңыраудан негізгі функцияға қайтару тең   exit функциясын негізгі функциямен қайтарылған мәнмен шақырады   оның дәлелі ретінде 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
қосылды
ohhhh, иә, енді сізді түсіндім (тырнақшаңызда int main -тегі мәлімдеме туралы айтылады, қайтару құны туралы емес), СІЗДІҢ СІЗ!
қосылды автор Keine Lust, көзі
Мүмкін сізде ештеңе жоқ, бірақ компилятор жұмыс істейді, редакцияны қараңыз
қосылды автор Keine Lust, көзі
Қайтару түрі int-пен үйлесімді болмаса, хост-ортаға қайтарылған тоқтату күйі анықталмаған.
қосылды автор Keine Lust, көзі
Мен түсінбеймін, бұл мәселе немен байланысты? Бұл код функцияның мәлімделген қайтару түріне сәйкес келмейтін түрдің мәнін қайтаруға тырысады және бұл әрқашан дұрыс емес. Егер қайтару түрі int ... -мен үйлесімді болмаса, Егер қайтарылған түрдің мәні int ... . Бұл return операторындағы мәннің нақты түріне емес, функцияның қайтарылған қайтарылған түріне қатысты айтылады.
қосылды автор effeffe, көзі
Ия, ал егер біз мұны неге жасай алмайтынымыз туралы ойласақ?
қосылды автор effeffe, көзі
Бұл тармақта біз мұны істей алатынымызды қайдан білеміз? Бұл жай ғана бұл жағдайда біз қайтып оралған мәртебені білмейміз деп айтпайды ма? (бұл әрине жақсы емес)
қосылды автор effeffe, көзі

Қызықты жауап:

Көптеген адамдар жоқ дейді, бірақ менің ойымша, иә! (Сұрыптау)

32 биттік көрсеткішті қайтара аласыз, ол кейін 32-биттің өлшемі 32 сантиметрді құрайтын 32-биттік жүйе бар, ал 32-биттің өлшемі ақ.

Одан кейін, операциялық жүйе бұл жадты басқа бағдарламаға пайдалану үшін бөліп бермейді деп үміттенеді және бағдарламаның оны қайта жазмайтындығына үміттенеді. Егер сіз Windows немесе Linux секілді осалдығын пайдалансаңыз, менің түсінігім жадыны босатпаса да, оны осылай босатады. (Дегенмен әрқашан сіздің жады босатуға тиіс, бірақ сіз лас бағдарламашы боласыз!)

Менің білуімше, басқа бағдарлама басты() қайтаратын орынға көрсеткішті жариялай алады, содан кейін байт бойынша байт байтындағы (енді) беттің мазмұнын оқи алады.

Менің ойымша бұл жұмыс істеу керек пе? Тексеру уақыты! (Бұл қате түрде қате болуы мүмкін және көптеген анықталмаған нәрселер болуы мүмкін.)

Бұл жауапты өте байсалды қабылдамаңыз. Егер сіз оны ұсынсаңыз, онда сіз жұмысқа орналасу мүмкіндігін бұзуы мүмкін.

0
қосылды

Басқалар атап өткендей, егер main мәнінің қайтарымы int -мен үйлеспейтін болса, оның мәні «анықталмаған». Бұл дегеніміз, компилятор C стандартын бұзбастан қайтарылатын мәнді қалаған нәрсені істей алады және құрылым түрін қайтару үшін portable C бағдарламасына мүмкін емес. Екінші жағынан, C стандарттарында ештеңе де компилятордың сатушылары құрылымның түрі main қайтаруға тырысса, не болатынын құжаттамауды талап етпейді және компилятордың құжатталған әрекеті ешқашан пайдалы болмауы керек . Егер операциялық жүйеде primaryReturnCode және secondaryReturnCode айнымалысы болса және компилятордың сатушысы int мәндері бар құрылымды қайтаруды көрсетсе, бірінші primaryReturnCode және secondaryReturnCode ішінде екіншісінде сақталатын мән, мұндай сипаттамалар мүлдем заңды болар еді.

C ++ бағдарламасында int функциясын қайтаратын main функциясы болуы керек. Сондай-ақ, 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, көзі
Мен OS құрылымында қағазды жазған жоқпын. Адам бастан құрылымды қайтара алады ма деп сұраса, мен олар жоғары техникалық емес деп есептейді. О, және БТВ, иә. Бастапқы тағы не істеуге болады? Баспа спулері?
қосылды автор user2513931, көзі