Co oznacza „komentarz #pragma”?

169

Co #pragma commentw dalszej części oznacza?

#pragma comment(lib, "kernel32")
#pragma comment(lib, "user32")
user198729
źródło

Odpowiedzi:

188

#pragma commentto dyrektywa kompilatora, która wskazuje programowi Visual C ++ na pozostawienie komentarza w wygenerowanym pliku obiektu. Komentarz może następnie zostać odczytany przez konsolidator podczas przetwarzania plików obiektowych.

#pragma comment(lib, libname) informuje konsolidator, aby dodał bibliotekę 'libname' do listy zależności bibliotek, tak jakbyś dodał ją we właściwościach projektu w Linker->Input->Additional dependencies

Zobacz komentarz #pragma w witrynie MSDN

KeatsPeeks
źródło
2
Czy to tylko MSVC, czy GCC / Intel Compiler / Clang ma coś podobnego? Czy istnieje opcja dodania ścieżki folderu (Lubię to Linker -> General -> Additional Library Directories)?
Royi
4

Zawsze nazywałem je „dyrektywami kompilatora”. Kierują kompilatorem do wykonywania różnych czynności, rozgałęziania, w tym bibliotek, takich jak pokazano powyżej, wyłączania określonych błędów itp., Podczas fazy kompilacji.

Firmy kompilujące zwykle tworzą własne rozszerzenia, aby ułatwić korzystanie z ich funkcji. Na przykład (jak sądzę) Microsoft rozpoczął transakcję „#pragma Once” i dotyczyło to tylko produktów MS, teraz nie jestem tego taki pewien.

Dyrektywy Pragmy Zawiera "komentarz #pragma" w tabeli, którą zobaczysz.

HTH

Podejrzewam, że na przykład GCC ma swój własny zestaw # pragmy.

JustBoo
źródło
6
Źle zrozumiałeś pytanie. Nie pyta, czym są pragmy i odnosi się do nich jako do komentarzy, a nie do dyrektyw. Pyta konkretnie, co #pragma commentto znaczy.
Rob Kennedy
2
Niezręczne tutaj, w rzeczywistości jest to dyrektywa dla konsolidatora.
Hans Passant
@Hans: Hmm, więc w tym przypadku nazwalibyśmy to „dyrektywą konsolidatora”?
JustBoo
1
Nie, to wciąż dyrektywa kompilatora. Mówi kompilatorowi, aby zostawił notatkę konsolidatorowi, aby uwzględnić tę bibliotekę.
HerrJoebob
0

Te łącza w bibliotekach wybranych w MSVC ++.

bobobobo
źródło
0

Dyrektywy Pragma określają opcje kompilatora specyficzne dla systemu operacyjnego lub komputera (x86 lub x64 itp.). Dostępnych jest kilka opcji. Szczegóły można znaleźć pod adresem https://msdn.microsoft.com/en-us/library/d9x1s805.aspx

#pragma comment( comment-type [,"commentstring"] ) ma ten format.

Szczegółowe informacje na temat różnych typów komentarzy można znaleźć pod adresem https://msdn.microsoft.com/en-us/library/7f0aews7.aspx .

#pragma comment(lib, "kernel32") #pragma comment(lib, "user32")

Powyższe wiersze kodu zawierają nazwy bibliotek (lub ścieżki), które mają być przeszukiwane przez konsolidator. Te szczegóły są zawarte jako część rekordu wyszukiwania biblioteki w pliku obiektowym.

Tak więc w tym przypadku kernel.libi user32.libsą przeszukiwane przez konsolidator i dołączane do końcowego pliku wykonywalnego.

Shrikanth N
źródło
0

Odpowiedzi i dokumentacja dostarczona przez MSDN jest najlepsza, ale chciałbym dodać jeden typowy przypadek, z którego często korzystam, który wymaga użycia na przykład #pragma commentdo wysłania polecenia do linkera w czasie łącza

#pragma comment(linker,"/ENTRY:Entry")

powiedz linkerowi, aby zmienił formularz punktu wejścia, WinMain()aby Entry()po tym nastąpiło CRTStartupprzeniesienie kontrolera doEntry()

zerocool
źródło