#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?


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:


21

Po prostu odwróć to:


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


Podoba mi się twój styl (=
étale-cohomology,

6

6

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


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ść:

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.