visual studio fordító (indítási műveletnél), MyBlog
Ez eddig csak tervezet
Tekintsük a következő egyszerű példa a Windows-konzol alkalmazás, amely kiírja az összes paramétert át a parancssor és a környezeti változók (envp - a mutatót tartalmazó tömb a környezeti változók és értékeik elválasztva egyenlőségjel (=)):
.bat fájlt, lefordítja a példa a következő:
Ez feltételezi, hogy a következő helyeken
Minden Windows-alapú alkalmazások kell megadnia funkciót. végrehajtására, amelynek te vagy a felelős. Két ilyen funkciók:
_tWinMain és _tmain valójában makrók, amelyek leírják, WinMain vagy wWinMain számára _tWinMain és a fő vagy wmain számára _tmain attól függően, e vagy sem a használata Unicode.
Tény, hogy a bemeneti funkciót aktiválja az operációs rendszer. Ehelyett van egy fellebbezést az indítási funkció a C / C ++ könyvtárak. adott időpontjában az elrendezés paraméter -entry: parancssor. Ez inicializálja a könyvtár C / C ++, így hivatkozhat funkciók, mint a malloc és free. és biztosítja a helyes létrehozását valakinek deklarált globális és statikus C ++ - tárgyak végrehajtása előtt a kód kezdődik. Az alábbi táblázat mutatja az eseteket, amelyekben bevezetett bizonyos bemeneti funkciók.
Alkalmazás típusok és az ezeknek megfelelő bemenet funkció
A linker kiválasztásáért felelős alkalmas kiinduló funkciót könyvtárából C / C ++, ha összekötő végrehajtható. Ha megadja a kulcsot / alrendszer: WINDOWS. linker a kódot, vagy a funkció WinMain wWinMain. Ha ezek a funkciók nem, a kapcsolót hibát jelez „megoldatlan külső jel”. Egyébként kapcsoló választja WinMainCRTStartup vagy wWinMainCRTStartup, ill.
Hasonlóképpen, ha megadjuk a kulcsot / alrendszer: a konzol. linker a kód a fő funkciója, vagy wmain és kiválasztja megfelelően mainCRTStartup vagy wmainCRTStartup; ha a kód nem fő, sem wmain jelentett ugyanaz a hiba - „megoldatlan külső jel”.
De nem sokan tudják, hogy a tervezet lehetséges, hogy nem adja meg a kulcsot / alrendszer kapcsoló. Ha így tett, a linker Maga határozza meg az alrendszer az alkalmazás. Amikor összeköti, hogy ellenőrizze, hogy a négy funkció (WinMain, wWinMain, fő vagy wmain) van jelen a kódban, és ennek alapján választja ki alrendszer és start funkció C / C ++ könyvtárak.
Most néhány megjegyzést a .bat fájlt, és a kulcsokat a fordító és linker
Amikor létrehoz egy .bat fájlt világosan meg kell követni annak érdekében, hogy hozzon létre szöveges fájlok vonallezárást formátum Windows vagy Unix stílusban. de nem a Mac. egyébként a bat fájlt csak nem indul el.
A normál működés a fordító hívása előtt cl.exe vagy link.exe esetén kérjen hívás „% vc_path% vcvarsall.bat” x86. Ez bat fájl inicializálja változói között környezetben. LIB. LIBPATH. PATH és néhány egyéb szükséges munka és cl.exe link.exe. Például az én esetemben, ez volt
A következő gombok hívásakor cl.exe:
- / S - a válogatás nélküli kötődés
- / ZI - fordító tartalmazza a hibakeresési információkat az alkalmazás adatbázis (x86 only)
- / Nologo - elnyomják a kijelző információt a fordító
- / W3 - állítja a szintet fordító figyelmeztetési szint 3
- / Od - letiltja optimalizálás (mert / Od kód megakadályozza az gombot a beállítás folyamatát megkönnyíti hibakeresés)
- / Oy - meggátolja az frame mutatók a hívási verem, / Oy- letiltja ezt a viselkedést (x86 only)
- / D "_DEBUG" - határozza fordításkor / gombokkal LDD, / MDD és / MTD
- / D "a_blakban" - határozza meg, hogy a cél OS - Windows-
- / D „UNICODE” - jelzi, hogy a fordító alkalmazáson belüli változata Win API funkciók dolgozni Unicode
Például itt van egy részlet a WinUser.h. Azaz, ha összeállítjuk adja meg a / D „UNICODE”, és a kódban hívás CreateWindowEx. valójában mi is fog fellebbezni CreateWindowExW - / D „_UNICODE” - szerű UNICODE jelzi a funkciók használatának alkalmazása változata a C könyvtár dolgozni Unicode karakterláncok. Például a header fájlban megtalálható TChar.h következő makró definíció: Most, amikor hívja _tcslen _UNICODE és konkrét hívás hagyjuk wcslen. egyébként - a strlen. Alapértelmezésben az új C ++ - _UNICODE (Unicode) által meghatározott Visual Studio projektek
- / Gm - tartalmaz egy minimális újrafordítás, amely lehetővé teszi, hogy újrafordítani a módosított forrás fájlok csak
- / EHsc - elfogott csak C ++ kivételeket és gondoskodik arról, hogy a külső C függvények nem dobja a C ++ kivétel
/ RTC (Run Time Error csekkek) (run-time error ellenőrzést)
/ RTC1 - egyenértékű / RTCsu
/ RTCs - magában foglalja a futásidejű verem keret, ami azt jelenti:
- inicializálás a lokális változók nem nulla értéket. Ez lehetővé teszi, hogy azonosítsa a hibákat, amelyek nem jelennek meg a debug verzió. Nagy élő lehetőségét, hogy a verem változó nulla lesz hibakeresés épít, mint riliznoy szerelés, mert a fordító optimalizálja verem változókat Reelin szerelvény. Ha már kiosztott a használata a memória verem nem nullázódik a fordító. Eszerint az alábbiak nincsenek változók a stack tartalmazza az érték a fennmaradó korábbi használata ez a memóriaterület.
- Ellenőrizze exit külföldön a lokális változók, mint a tömbök. / RTCs nem határozza kiadási külföldön elérésekor memória a memória szerkezet a helyzet eredménye volt a nyomvonal a fordító. Ez akkor fordulhat elő, ha a beállítás (C ++). / Zp vagy csomag, vagy ha vannak elhelyezve elemei a szerkezet oly módon, amely meggátolja, hogy a fordító helyezze padding.
- Ellenőrizze a stack pointer, amely lehetővé teszi, hogy azonosítsa a pusztítás a stack pointer. Megsemmisítése a stack pointer bekövetkezhet a nem hívásra vonatkozik. Például, egy mutató arra a funkcióra, akkor követ akármi válasz hívni egy függvényt a DLL exportál __stdcall. de megadott egy mutató arra a funkcióra, mint __cdecl.
megjegyzés:
verem (funkció) - területe lefoglalt memória, ha a funkciót nevezik, az ideiglenes tárolást érvek és lokális változók a függvény.
/ RTCu - okozza, hogy a fordító a figyelmeztetés, ha egy változót használjuk nélkül elindulni. Például a parancsot, hogy létrehoz egy figyelmeztetés (4. szint) S4701 is generálhat a futásidejű hiba közben egy kulcs / RTCu. Bármely parancs, hogy létrehoz egy fordítási figyelmeztetés (szint 1 és 4) S4700. Azt is hibát generál alatt futásidejű kulcs / RTCu.
Azonban, hogy a következő kódot: