2013-10-02 10 views
6

Czy istnieje sposób na powstrzymanie ekspansji makr preprocesora? Mam istniejący plik nagłówkowy C, który używa #define do zdefiniowania zbioru liczb całkowitych i chciałbym skopiować go do wyliczenia C++, który ma te same nazwy wartości. Na przykład (przy użyciu C++ 11):Wstrzymanie ekspansji makra

enum MyEnum { 
    VALUE, 
    // ... 
}; 

#define VALUE 0 

MyEnum convert(int x) { 
    if (x == VALUE) { 
    return MyEnum::VALUE; 
    } 
    // ... 
} 

Problem oczywiście jest to, że MyEnum::VALUE zostanie przetłumaczony na MyEnum::0, co powoduje błąd składni. Najlepszym rozwiązaniem jest zamiana makr na wyliczenia, ale niestety nie jest to opcja w mojej sytuacji.

Próbowałem użyć konkatenacji, ale to nie pomogło (kompilator dał ten sam błąd).

#define CONCAT(a,b) a##b 
// ... 
return MyEnum::CONCAT(VA,LUE); // still results in MyEnum::0 

Czy istnieje inne rozwiązanie, które pozwala mi mieć tę samą nazwę dla makra i wartości wyliczenia?

+0

Konwencją wieloletnią jest to, że WSZYSTKIE UPPERCASE są używane w makrach, a wszystko inne używa co najmniej jednej małej litery. To znaczy. 'enum MyEnum {Wartość}'. – MSalters

Odpowiedz

3

Można definiowanie makra:

#undef VALUE 

po uwzględnieniu nagłówka.

+2

Należy zauważyć, że spowoduje to, że makro będzie niezdefiniowane dla reszty pliku, więc jeśli makro ma być użyte później w źródle, musi zostać ponownie zdefiniowane. –

+0

Prawidłowo. To rozwiązanie nie działa. –

Powiązane problemy