ПредишенСледващото

Това е засега само проект

Да разгледаме следния прост пример за приложение за конзолата на Windows, която отпечатва всички параметри, предавани на командния ред и променливи на обкръжението (envp - указател към масив, съдържащ на околната среда променливи и техните стойности, разделени със знак за равенство (=)):

.бухалка файл, компилира този пример е, както следва:

Това предполага следното местоположение файл

Visual Studio компилатор (начало на работата), myblog

Всички Windows-базирани приложения трябва да бъдат въвеждани функция. за изпълнението на която вие сте отговорни. Има два такива функции:

_tWinMain и _tmain всъщност макроси, които са описани като WinMain или wWinMain за _tWinMain и основна или wmain за _tmain в зависимост от това, дали използването на Unicode.

В действителност, функцията за въвеждане се използва от операционната система. Вместо това, има жалба до започване на функцията на ++ библиотеки C / C. дадени по време на оформлението параметър -entry на: командния ред. Той инициализира библиотеката на C / C ++, така че може да се позове на функции като изчистване и безплатно. и осигурява правилното създаването на някой от вас обявен глобални и статични C ++ - предмети, преди да започне изпълнението на кода си. Таблицата по-долу показва, случаите, в които изпълняват определени входни функции.

видове приложения и техните съответни вход функция

Линкерът е отговорен за избор на подходящ изходен функция от библиотека на C / C ++ при свързването изпълним. Ако зададете ключ / подсистема: WINDOWS. свързваща търси кода или функцията WinMain wWinMain. Ако тези функции не са, свръзката съобщава за грешка при "нерешен външен символ". В противен случай свързваща избира WinMainCRTStartup или wWinMainCRTStartup, съответно.

По същия начин, ако посочите ключовата / подсистема: конзола. линкер код търси основната функция или wmain и избира съответно mainCRTStartup или wmainCRTStartup; ако кодът не основен, нито wmain, предаде една и съща грешка - "нерешен външен символ".

Но не много знаят, че проектът е възможно да не се посочва ключ / ПОДСИСТЕМА свързваща. Ако сте направили това, свръзката ще се определи подсистемата за вашата кандидатура. Когато става свързването да се провери кои от четирите функции (WinMain, wWinMain, основен или wmain) присъства в кода си, и на тази основа ще избере подсистема и да започне да функционира в C / C ++ библиотеки.

Сега няколко коментара за файла .bat и ключовете на компилатора и свързващата

Когато създавате .bat файл, който трябва ясно да следва реда за създаване на текстови файлове имат линия прекратяване формат в Windows или Unix стил. но не и Mac. в противен случай файлът бухалка просто не се стартира.

За нормална работа на компилатора преди да се обадите или cl.exe link.exe трябва Обаждане по телефона "% vc_path% vcvarsall.bat" x86. Това бухалка файл инициализира променливи включват среда. LIB. LIBPATH. PATH и някои други необходими за работа и cl.exe link.exe. Например, в моя случай, това беше

Следните бутони се използват, когато се обаждате cl.exe:

  • / S - компилация без свързване
  • / ЗИ - съставител включва информация за отстраняване на грешки в базата данни на приложения (за x86 само)
  • / Nologo - подтискане на дисплея на информация за компилатора
  • / W3 - определя нивото на компилатор ниво предупреждение 3
  • / Од - забранява оптимизация (защото / Od код предотвратява движението на процеса на определяне на ключа улеснява отстраняване на грешки)
  • / Oy - предотвратява създаването на рамка указатели в набора от повикване, / Oy- забранява това поведение (за x86 само)
  • / D "_DEBUG" - се определя по време на компилация с ключове / ДЛД, / MDD и / MTD
  • / D "_WINDOWS" - определя, че целевата операционна система - Windows
  • / D "UNICODE" - показва, компилаторът да се използва в приложения, версия на Победа API функции за работа с Unicode
    Например, тук е фрагмент от WinUser.h. Това означава, че ако ние се съберат уточни / D "UNICODE" и във вашата CreateWindowEx код повикване. какво наистина се случва на обжалване CreateWindowExW
  • / D "_UNICODE" - като UNICODE показва използването на функции във версия на приложението на библиотеката C за работа с Unicode низове. Така например, в заглавната част на файла може да се намери TChar.h след макро дефиниция: Сега, когато се обадите _tcslen _UNICODE и специална покана е позволено да wcslen. в противен случай - в strlen. По подразбиране, новата C ++ - _UNICODE (както UNICODE), определена от Visual Studio проекти
  • / GM - включва минимум прекомпилиране, което позволява да компилирате с модифицираните изходните файлове само
  • / EHsc - заловено само C ++ изключения и гарантира, че функциите на външни C Никога не хвърляйте C ++ изключение

/ RTC (Run време проверява за грешки) (по време на изпълнение проверка за грешки)

/ RTC1 - еквивалент / RTCsu

/ RTCs - включва по време на работа стека конструкция, което означава:

  • инициализация на локални променливи не са нулеви стойности. Това ви позволява да се идентифицират грешки, които не са включени в строя за отстраняване на грешки. Голям живо вероятност променлива стека ще бъде нула в отстраняване на грешки изгражда, отколкото в riliznoy монтаж, защото компилаторът оптимизира стека променливи в събранието релин. След като са били разпределени за използването на стека с памет не е занулен от компилатора. Според това, следното не се инициализира променливи в стека ще съдържа стойността на остатъка от предишното използване на тази област на паметта.
  • Проверете за излизане в чужбина на локални променливи, като например масиви. / RTCs не определя продукцията си извън страната при достъп до паметта в структурата на паметта на ситуацията, която е резултат от изравняването на компилатора. Това може да се случи, когато се използва изравняване (C ++). / Zp или пакет или ако са поставени елементи на структурата по такъв начин, че силите на компилатора да вмъкнете подложка.
  • Проверете показалеца стека, което ви позволява да се идентифицират унищожаването на показалеца на стека. Унищожаване на показалеца на стека може да се появи от видовете не са разговори. Например, с помощта на указател към функция, можете да проследите коментарите към извикате функция от DLL, което се изнася като __stdcall. но сте определили указател към функция като __cdecl.

забележка:
стека рамка (функция) - с площ от заделена памет, когато функцията се нарича, е предназначен за временно съхранение на аргументи и локални променливи на функцията.

/ RTCu - причинява компилаторът да издава предупреждение, когато една променлива се използва без инициализация. Например, командата, която генерира предупреждение (4-то ниво) S4701 също може да генерира грешка по време на работа по време на ключова / RTCu. Всички команди, които генерират предупреждение компилатор (ниво 1 и 4) S4700. Тя също така ще генерира грешка по време на ключ по време на работа / RTCu.

Все пак, имайте предвид следното кодовия фрагмент:

навигация в публикациите

Вашият коментар Отказване на отговора

Подкрепете проекта - споделете линка, благодаря!