2013-04-04 14 views
8

Niedawno natknąłem się na ten rodzaj kodu w czyjejś klasie cieniowania OpenGL i nie jestem pewien co do jej użycia.C++ Definiowanie pre-procesora po słowie kluczowym klasy i przed nazwą klasy

Jak rozumiem, czytając IBM's documentation, #define ONEWORD usunie wszelkie wystąpienia ONEWORD w kolejnym tekście.

Jaki jest cel posiadania WSTĘPU w tym kodzie, jeśli wszystkie wystąpienia zostały usunięte? Co tak naprawdę oznacza posiadanie takiego tokena po słowie kluczowym klasy, ale przed nazwą klasy?
Używałem tylko #define do włączania strażników w przeszłości, więc jest to dla mnie całkowicie nowe.

#define ONEWORD 

class ONEWORD FooClass 
{ 
    FooClass(); 
    ~FooClass(); 
}; 

Kod Widziałem to w jest tutaj: https://dl.dropbox.com/u/104992465/glsl.h
Na wszelki wypadek zrobiłem jej kontekst zbyt abstrakcyjne.

+1

Często widziałem dwunożne zwierzęta chodzące w tajemniczych kwadratowych zagrodach, o co w tym wszystkim chodzi? [Cóż, sama na nie odpowiem, chodzi o usunięcie krytycznych informacji o tym, co zaobserwowałem i generalizowanie własnego wrażenia, a następnie o to pytam.] –

Odpowiedz

4

Och, więc po patrząc na rzeczywistej Kodeksu , nie jest to ONEWORD, ale raczej GLSAPI. Te makra XYZ_API są często używane do warunkowego określania powiązania specyficznego dla platformy, na przykład niektórych __attributes__, które wymagają innego traktowania na przykład w systemach Windows i Unix. Więc można się spodziewać GLSAPI zostać określone w jednym z plików nagłówkowych (być może w config.h) tak:

#ifdef WIN32 
# define GLSAPI __dllimport 
#elif defined __linux__ 
# define GLSAPI __attribute__((visibility("visible"))) 
#else 
# define GLSAPI 
#endif 

(Pseudo-kod, nie jestem pewien o wszystkich atrybutów i powiązań „kwalifikatorów”, ale możesz sprawdzić je w kodzie.)

+1

#else, jeśli linia jest wątpliwa. –

+0

W faktycznym kodzie nie został zdefiniowany w ten sposób. Był tylko wiersz '#define GLSAPI' – maditya

+0

@maditya Nie mówię, jak to ** zostało zdefiniowane, próbowałem wyjaśnić, jak to ** ma być ** określone, i jaki jest tego powód. –

5

Umożliwia to łatwe dodawanie słów kluczowych kompilatora do deklaracji klasy. Na przykład z Visual Studio, jeśli chciał umieścić tej klasy w DLL, należy zmienić definicję

#define ONEWORD __declspec(dllexport) 

Zobacz here dla innego przykładu

Powiązane problemy