У вас есть только один экземпляр NAME в каждом макросе. У вас также есть пример _NAME в каждом макросе, но это очень сомнительно: имена, начинающиеся с подчеркивания и имеющие заглавную букву, зарезервированы для реализации, и поэтому у вас может возникнуть проблема.
Однако вы хотите взять значение NAME и связать что-то с ним, скажем, поставить E_
впереди. Это немного сложно, так как _##NAME
обычно получит вам _NAME
, независимо от того, что вы положили.
Это объясняется в C ++ FAQ Lite , но что вам действительно нужно сделать, это что-то вроде:
#define REALLY_CONCATENATE(a,b) a ## b
#define CONCATENATE(a,b) REALLY_CONCATENATE(a,b)
#define SCOPED_ENUM_HEADER(NAME) struct NAME{ enum CONCATENATE("E_", NAME) {
(извините, сейчас я не могу это проверить).
С другой стороны, должен быть лучший способ сделать то, что вы делаете. Серьезно.