• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

c++ pliki.cpp funkcja main

Object Storage Arubacloud
0 głosów
236 wizyt
pytanie zadane 18 listopada 2020 w Programowanie przez milosz123 Użytkownik (720 p.)

Witam uczę się ostatnio pracy na i zacząłem się zastanawiać na jakiej zasadzie dzieła plik bo z tego co się uczyłem to funkcja main w pliku z rozszerzeniem cpp musi być to jeśli pracuję na kilku plikach i  zrobię sobie przykładowo plik kod.cpp który podlinkuję i zaznaczę obcję żeby osobno skompilowało ten plik żebym nie musiał go podłączać osobno, chodzi mi oto aby wystarczył podłączony plik z deklaracjami funkcji, klas a ten plik kod cpp żeby był podlinkowany i osobno się kompilował i w tym pliku będzie przykładowy kod

#influde "deklaracje_funkcji.hpp"

int funckja1( int a ) {
       return 10;
}

to dlaczego taki plik daje się osobno poza main.cpp skompilować jeśli niema tam main

komentarz 18 listopada 2020 przez NewEraOfPeace Gaduła (4,790 p.)
Generalnie, to nie, nie każdy kod w C++ musi mieć funkcję main (w przypadku pisania kodu pod kompilatory freestanding)
komentarz 18 listopada 2020 przez tkz Nałogowiec (42,000 p.)
Skąd masz te informacje?
komentarz 18 listopada 2020 przez NewEraOfPeace Gaduła (4,790 p.)
komentarz 19 listopada 2020 przez tkz Nałogowiec (42,000 p.)
I w którym miejscu widnieje zapis, że funkcja main nie jest wymagana?
komentarz 19 listopada 2020 przez Oscar Nałogowiec (29,320 p.)
Funkcję main wywołuje kod startowy z crt (c runtime). Nie wiem jak inne środowiska, ale gcc (ld) umożliwia pominięcie linkowania kodu startowego. Wtedy program startuje po prostu od pierwszej funkcji w nim zawartej. Normalnie pierwszym blokiem kodu do linkowania jest właśnie kod startowy i to z jego budowy (tego że woła main()) wynika konieczność dostarczenia tej funkcji.
komentarz 19 listopada 2020 przez NewEraOfPeace Gaduła (4,790 p.)
freestanding hosted
In a freestanding implementation, it is implementation-defined whether a program is required to define a main function. Start-up and termination is implementation-defined; start-up contains the execution of constructors for objects of namespace scope with static storage duration; termination contains the execution of destructors for objects with static storage duration. In a hosted implementation, a program must contain a global function called main. Executing a program starts a main thread of execution in which the main function is invoked, and in which variables of static storage duration might be initialized and destroyed.

?
Kod do arduino ma funkcję main? Bo nie widziałem.
 

komentarz 19 listopada 2020 przez tkz Nałogowiec (42,000 p.)

?
Kod do arduino ma funkcję main? Bo nie widziałem.

Kod w arduino niema nic wspólnego z C/C++. Abstrahując, że nie widać jej tylko na pierwszy rzut oka... 

Jest napisane, że implementation-defined, nie że jej nie ma. Schodząc niżej i tak musisz wskazać przez assembly, czy cokolwiek innego, co jest funkcją główną(nie musi mieć nazwy main). 

 

 

komentarz 19 listopada 2020 przez NewEraOfPeace Gaduła (4,790 p.)

Ale ja nie pisałem o tym, że nie musi mieć funkcji głównej, tylko, że kod C++ nie musi zawierać funkcji main

bo z tego co się uczyłem to funkcja main w pliku z rozszerzeniem cpp musi być

standard jasno określa, że kompilatory hosted muszą uwzględnić globalną funkcję o nazwie main, z kolei freestanding mogą, ale nie muszą.

komentarz 19 listopada 2020 przez tkz Nałogowiec (42,000 p.)
Main - jako nazwy, nie musi zawierać. Main - jako funkcji startowej, musi zawierać. W ten sposób mam rozumieć Twoją wypowiedź?
komentarz 19 listopada 2020 przez NewEraOfPeace Gaduła (4,790 p.)
Tak.

1 odpowiedź

0 głosów
odpowiedź 18 listopada 2020 przez Oscar Nałogowiec (29,320 p.)
wybrane 18 listopada 2020 przez milosz123
 
Najlepsza

Program może składać się z wielu plików C/CPP, ale tylko w jednym może wystąpić funkcja main. Budowanie programu ze źródeł składa się z dwóch głównych etapów :

  1.  oddzielnej kompilacji każdego pliku .c/.cpp w wyniku czego powstają pliki .o/.obj. Jeśli w jednym pliku .c wywoływana jest funkcja w nim nieobecna kompilator "zostawia puste miejsce" oznaczając jaka funkcja na zostać tam wywołana. Dodatkowo oznaczona jest gdzie zaczynają się poszczególne funkcje zdefiniowane w danym pliku.
  2. Połączenia powstałych plików .o/.obj w jeden plik .exe. (dochodzą jeszcze biblioteki) Połączenie polega na takim prosty zsumowaniu kodu z plików .o(bj) a następnie wypełnieniu wszystkich "pusty miejsc" - linker (tak nazywa się program realizujący ten etap) patrzy jaka funkcje ma być wywołąna, potem szuka tej funkcji w połączonym kodzie i wpisaniu odpowiedniego adresu w puste miejsce.

Wynika z tego, że w całym połączonym kodzie może być tylko jedna funkcja o danej nazwie. Do tyczy to też funkcji main. W uproszczeniu można uznać, że pliki .c/.cpp zawierające funkcję main to program, te bez funkcji main to biblioteki - po prostu zestaw funkcji do wykorzystania w innych plikach.

Oczywiście różne kombajny do języka C mogą wiele z tych operacji ukryć przed użytkownikiem. Nawet gcc to taki kombajn korzystający z innych programów - przynajmniej tak było dawniej.

 

Podobne pytania

0 głosów
0 odpowiedzi 72 wizyt
0 głosów
1 odpowiedź 644 wizyt
0 głosów
2 odpowiedzi 242 wizyt
pytanie zadane 27 marca 2020 w C i C++ przez toja123321 Nowicjusz (220 p.)

92,583 zapytań

141,434 odpowiedzi

319,668 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...