Есть ли способ заблокировать расширение макропроцессора? У меня есть существующий файл заголовка C, который использует #define
для определения набора целых чисел, и я хотел бы скопировать его в перечисление C++, имеющее те же имена значений. Например (с использованием C++, 11):Расширение макроса запрета
enum MyEnum {
VALUE,
// ...
};
#define VALUE 0
MyEnum convert(int x) {
if (x == VALUE) {
return MyEnum::VALUE;
}
// ...
}
Проблема, конечно, в том, что MyEnum::VALUE
транслируется в MyEnum::0
, что вызывает ошибку синтаксиса. Лучшим решением является замена макросов на перечисления, но, к сожалению, это не вариант в моей ситуации.
Я попытался использовать конкатенацию, но это не помогло (компилятор дал ту же ошибку).
#define CONCAT(a,b) a##b
// ...
return MyEnum::CONCAT(VA,LUE); // still results in MyEnum::0
Есть ли другое решение, которое позволяет мне иметь одно и то же имя для макроса и для значения перечисления?
Долгосрочное соглашение заключается в том, что ALL UPPERCASE используется для макросов, а все остальное использует хотя бы одну строчную букву. То есть 'enum MyEnum {Значение}'. – MSalters