#ifdef wewnątrz #define

83

Próbuję napisać coś takiego:

Czy jest jakiś sposób, aby to zdefiniować COV_ON? Wiem, że to, co zrobiłem powyżej, jest złe, ponieważ nie mogę mieć #ifdefwewnątrz #define. ( #nie jest dozwolonym znakiem w #define). Czy jest więc jakieś rozwiązanie?

agent.smith
źródło
1
Wydaje się, że we wszystkich odpowiedziach pominięto użycie do {} while(0)(lub odpowiednik), aby uniknąć pustego stwierdzenia; zobacz moją odpowiedź w połączonym duplikacie
Roger Lipscombe

Odpowiedzi:

89

Niemożliwe. Zrób to na odwrót:

Hans Passant
źródło
21

Po prostu odwróć to:

Philip
źródło
Dzięki za odpowiedź. Próbowałem COV_ON (włączony) i COV_ON (wyłączony), ale potem pojawia się błąd z informacją o błędzie: oczekiwano „)”, prawie wyłączone. Każdy pomysł na problem.
agent.smith
są sznurkami. Czy muszę używać ich jako zwykłych ciągów w wycenie? Podobnie jak „on” i „off”.
agent.smith
To zależy od twojej definicji ZAKRESU, ale myślę, że musisz je zacytować. Proponuję, abyś otworzył kolejne pytanie dotyczące tego nowego numeru.
Philip
Wypróbowałem to z cytatami, ale bez sensu. Otworzyłem już nowy wątek. Daj mi znać, jeśli uważasz, że składnia _Pragma jest nieprawidłowa.
agent.smith
14

To stare pytanie, ale wymagało aktualnej odpowiedzi.

Zamiast używać wbudowanego ifdef w makrze, możesz wybiórczo zdefiniować __VA_ARGS__makro, aby zrobić to samo

Ma to podobną funkcjonalność jak ifdef, z tym wyjątkiem, że do wyznaczenia początku i końca używa się nawiasów (co w większości IDE nie ma problemów ze składaniem kodu). Chociaż nadal możesz używać #definei #ifdefw kontekście, #includejest to niedozwolone. Aby uzyskać podobne możliwości wbudowane #else, możesz zdefiniować odpowiednie makro w następujący sposób:

Tylko jeden z NO_FOO()/IF_FOOnich wyprodukuje kod.

OK, to przydatny hack, ale czy możemy uczynić go bardziej użytecznym niż #ifdefs... logika boolowska i być może konfiguracja? Skonfigurujmy kilka tabel prawdy (i kilka makr pomocniczych).

config.h

code.c

technozaur
źródło
Podoba mi się twój styl (=
étale-cohomology,
6
EboMike
źródło
6

Nie możesz. Ale możesz zamienić #ifdefi #define:

sam hocevar
źródło
Dzięki za odpowiedź. Próbowałem COV_ON (włączony) i COV_ON (wyłączony), ale potem pojawia się błąd z informacją o błędzie: oczekiwano „)”, prawie wyłączone. Każdy pomysł na problem.
agent.smith
Nie znając Twojego kompilatora, musielibyśmy wiedzieć, jaka jest oczekiwana _Pragmaskładnia; jak byś to zrobił bez makra?
sam hocevar,
Używam kompilatora VC2005 i widziałem online składnię _Pragma. Nigdy wcześniej nie używałem #pragma w ten sposób.
agent.smith
Będziesz więc potrzebował hacka na stringify. Zobacz to pytanie i odpowiedź .
sam hocevar,
Chyba problemem jest VC2005. Nie używają _Pragma, ale używają __pragma. Nie jestem pewien, ale tak to wygląda. Ale nadal otrzymuję ostrzeżenie o nieznanej pragmie z __pragmą.
agent.smith
3

Jak wspomniałeś, nie jest możliwe umieszczenie #ifdef w #define. Zamiast tego powinieneś zrobić odwrotną kolejność:

jberg
źródło