2013-10-02 3 views
6

Есть ли способ заблокировать расширение макропроцессора? У меня есть существующий файл заголовка 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 

Есть ли другое решение, которое позволяет мне иметь одно и то же имя для макроса и для значения перечисления?

+0

Долгосрочное соглашение заключается в том, что ALL UPPERCASE используется для макросов, а все остальное использует хотя бы одну строчную букву. То есть 'enum MyEnum {Значение}'. – MSalters

ответ

3

Можно вернуть макрос:

#undef VALUE 

после включения заголовка.

+2

Обратите внимание, что это сделает макрос неопределенным для остальной части файла, поэтому, если макрос будет использоваться позже в источнике, он должен быть переопределен. –

+0

Исправить. Это решение не работает. –

Смежные вопросы