Czytając symfonie c++ w rozdziale o preprocesorze natknąłem się na taką dykretywę __cplusplus
. Z tego co zrozumiałem to podczas pisania programu w C++ można to wpisać i zamiast w c ++ ten fragment skompiluje w języku C. Tylko nie wiem jak tego używać ? Pomoże ktoś ? Dzięki.
To co zrozumiałeś to skrajny bullshit
.
Masz i czytaj http://stackoverflow.com/questions/3789340/combining-c-and-c-how-does-ifdef-cplusplus-work
Mówiąc obrazowo i niekoniecznie ściśle: Kod w C w większości przypadków może być traktowany/kompilowany jako C lub jako C++. Makro __cplusplus
jest automatycznie zdefiniowane jeśli to się odbywa w trybie C++ (i nie jest dla trybu C).
Jeśli chcesz wiedzieć jaki tryb jest używany to możesz sprawdzić czy to makro jest zdefiniowane. Przydaje się jeśli np. zadowala Cię domyślne zachowanie kompilatora w trybie C, ale chcesz żeby trochę inaczej się zachował w trybie C++, np. nie dekorował nazw funkcji.
Chyba jedyne miejsce w którym to makro ma sens jest w pliku nagłówkowym, który ma być kompatybilny z C i z C++:
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
// ... tutaj cała treść nagłówka
#ifdef __cplusplus
}
#endif
w ten sposób pod C++ wszystkie zmienne i funkcje będą opatrzone dyrektywą extern "C"
, która (upraszczając) włącza kompatybilność z C, a pod C te ifdefy z extern będą pominięte.
extern "C"
oznacza (nadal w pewnym stopniu upraszczając) że importowana pod C++ funkcja została napisana w C, i w drugą stronę, że eksportowana funkcja napisana w C++ ma być widoczna i ma działać jeśli zostanie zaimportowana pod C.
a tak całkiem ściśle to extern "C"
zmienia sposób „manglowania” nazw ze schematu przyjętego (pod daną platformą) dla C++ na ten przyjęty dla C.
samo __cplusplus
nie robi nic i nadaje się tylko w połączeniu z ifdef
/ifndef
.
Na upartego można by zrobić coś takiego:
#ifdef __cplusplus
// kod dla C++
#else
// kod dla C
#endif
ale to raczej WTF ;-)