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