Domyślnymi konwencjami nazewnictwa oraz wywoływania są konwencje języka C. W związku z tym, zastosowanie modyfikatora __cdecl potrzebne jest tylko wtedy, gdy ustawiona jest opcja kompilatora /Gz (__stdcall) lub /Gr (__fastcall). Opcja kompilatora /Gd wymusza konwencję wywoływania __cdecl. Przykład W poniższym przykładzie kompilator zostaje „poinstruowany”, że w przypadku funkcji należy zastosować konwencję nazewnictwa i wywoływania języka C: M #;F# F; # ; ;= P125QM $9 % M #;F# F; # ; ;R ; ;= -GG6% $ ' % 8&9 % &)SG1)& __declspec Słowo kluczowe __declspec jest wykorzystywane w celu określania klasy pamięci (ang. storage-class) przy użyciu tzw. składni atrybutów rozszerzonych (ang. extended attribute syntax). Za pomocą słowa kluczowego __declspec ustalamy, że egzemplarz danego typu ma zostać umieszczony w pamięci wraz z jednym z wymienionych poniżej atrybutów klasy pamięci specyficznych dla kompilatora Microsoftu. Przykładami innych modyfikatorów klasy pamięci są słowa kluczowe static oraz extern. Te słowa kluczowe wy-stępują jednak w specyfikacji ANSI języków C oraz C++ i dlatego nie są uwzględnione w składni atrybutów rozszerzonych. Składnia atrybutów rozszerzonych upraszcza i stan-daryzuje rozszerzenia wprowadzone przez firmę Microsoft do języków C oraz C++. Oto gramatyka atrybutów rozszerzonych dla języka C++. Gramatyka specyfikator-deklaracji : __declspec ( sekwencja-modyfikatorów-deklaracji-rozszerzonej ) sekwencja-modyfikatorów-deklaracji-rozszerzonej: modyfikator-deklaracji-rozszerzonejopc modyfikator-deklaracji-rozszerzonej sekwencja-modyfikatorów-deklaracji-rozszerzonej modyfikator-deklaracji-rozszerzonej : align(#) allocate("nazwasegmentu") deprecated dllimport dllexport naked noinline noreturn nothrow novtable property({get=nazwa_funkcji_get|, put=nazwa_funkcji_put}) 26 Rozdział 2. Słowa kluczowe, modyfikatory oraz instrukcje selectany thread uuid("GUID_ObiektuCom") Separatorem w sekwencji modyfikatorów deklaracji jest znak odstępu. Przykłady pojawią się w dalszej części książki. Gramatyka atrybutów rozszerzonych udostępnia następujące atrybuty klasy pamięci specyficzne dla kompilatora Microsoftu: align, allocate, deprecated, dllexport, dllimport, naked, noinline, noreturn, nothrow, novtable, selectany oraz thread. Dostępne są również następujące atrybuty dotyczące obiektu COM: property oraz uuid. Atrybuty klasy pamięci thread, naked, dllexport, dllimport, nothrow, property, selectany oraz uuid są właściwościami wyłącznie deklaracji obiektu lub funkcji, do której zostały zastosowane. Atrybut thread ma wpływ jedynie na dane i obiekty. Atrybut naked ma wpływ jedynie na funkcje. Atrybuty dllimport oraz dllexport wpływają na funkcje, dane oraz obiekty. Atrybuty property, selectany oraz uuid mają wpływ na obiekty COM. Słowo kluczowe __declspec powinno zostać umieszczone na początku deklaracji prostej. Kompilator zignoruje, bez ostrzeżenia, wszystkie słowa kluczowe __declspec umieszczone po operatorach lub , a także tuż przed identyfikatorem zmiennej w deklaracji. Atrybut __declspec określony na początku deklaracji typu definiowanego przez użyt-kownika dotyczy zmiennych tego typu, na przykład: $ T' T W tym przypadku atrybut dotyczy zmiennej . Atrybut __declspec umieszczony po słowie kluczowym class lub struct dotyczy danego typu definiowanego przez użytkow-nika, na przykład: $ T W tym przypadku atrybut dotyczy typu . Ogólna zasada dotycząca stosowania atrybutu __declspec w przypadku deklaracji pro-stych jest następująca: ! Sekwencja-specyfikatorów-deklaracji powinna zawierać między innymi typ bazowy (np. int, float, typ typedef lub nazwę klasy), klasę pamięci (np. static, extern) lub rozszerzenie __declspec. Lista-inicjalizowanych-deklaratorów powinna zawierać między innymi wskaźnikową część deklaracji, na przykład: % 8"GU ? EE&=; E E C#DA C ; <; = % "GU ? EE&=; E E C#DA C ; <; = % "-VW)& EE =#DA C ; Słowa kluczowe od A do Z 27 W poniższym fragmencie kodu zadeklarowano zmienną lokalną wątku typu int i przy- pisano jej wartość początkową. M #;F# F; # 9 8 __event Deklaruje zdarzenie. Uwagi Słowo kluczowe __event można zastosować w deklaracji metody, deklaracji interfejsu lub deklaracji danej składowej. W zależności od tego, czy źródło oraz odbiorca zdarzeń tworzone są w rodzimym języku C++, w technologii COM, czy w tzw. kodzie zarządzany m (ang. managed code) plat-formy .NET Framework, jako zdarzeń można użyć następujących konstrukcji: Rodzimy język C++ COM Kod zarządzany (.NET Framework) metoda — metoda — interfejs — — — dana składowa W celu skojarzenia metody obsługi zdarzenia z metodą zdarzenia należy użyć instrukcji __hook. Należy zauważyć, że po utworzeniu zdarzenia za pomocą słowa kluczowego __event, w momencie wywoływania tego zdarzenia zostaną wywołane wszystkie kolejno do niego „przyczepione” procedury obsługi. Deklaracja metody za pomocą słowa kluczowego __event nie może posiadać definicji — zostaje ona niejawnie wygenerowana, w wyniku czego dana metoda zdarzenia może zostać wywołana tak, jakby była zwykłą metodą. Zdarzenia rodzime Zdarzenia rodzime są metodami. Wartość zwracana jest zwykle wartością typu HRESULT
|