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

visual studio fordító (indítási műveletnél), MyBlog

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:

Hozzászólás navigáció

Hagy egy Válaszol Mégsem válaszát