C 使x宏在0时与do一起工作

C 使x宏在0时与do一起工作,c,c-preprocessor,x-macros,C,C Preprocessor,X Macros,当0 as对此不满意时,我试图使x宏与do一起工作。然而,它打破了逻辑。想知道是否有人有任何建议,使它的工作 #define X_TYPES do { \ X(BABA, "baba") \ X(INVALID, "invalid") \ } while (0) #define X(type, name) type, enum x_type { X_TYPES }; #undef X

当0 as对此不满意时,我试图使x宏与do一起工作。然而,它打破了逻辑。想知道是否有人有任何建议,使它的工作

#define X_TYPES do { \
        X(BABA, "baba") \
        X(INVALID, "invalid") \
} while (0)

#define X(type, name) type,
enum x_type {
    X_TYPES
};
#undef X                                                       
#define X(type, name) name,                                   
const char *x_name[] = {
    X_TYPES
};
#undef X    

int main()
{
    return 0;
}

您不能使用do while0包装X宏,因为它在语法上不适合它所要用于的枚举用例


在checker脚本中寻找异常机制,或将X宏放在一个单独的源文件中,该文件被排除在检查之外。

@Olaf c预处理程序的基本/独立性是否足够值得删除通用c标记?这是这些标签中的常见做法吗?设备驱动程序中有main的原因是什么?阅读文档如何编写驱动程序?为什么你会为了两个简单的条目而自甘堕落?@AndrasDeak:一次标记两种不相关的语言肯定不是常见的做法。如前所述,使用C标记是否有争议,OP似乎在询问有关宏的问题。总而言之,这个问题很不清楚,代码看起来像是在不知道如何工作的情况下被复制到一起的。旁注:X宏不是这样工作的。在一起编写代码之前,先学习语言并理解您打算使用的概念。不是使用X宏是一个好主意。@安德鲁斯达克:叹息我最初删除了C和C++标签,因为从标题看,它似乎只是CPP的Quest.然而,OP似乎并不理解x宏的概念。如果我还有票数,我会觉得不清楚。仅供参考:cpp可单独使用。它恰好被包含在C语言规范中,但是例如C++规范折射了C标准的这一部分。cpp也用于非C代码。你可以很好地预处理Java代码。请参阅平台上的cpp命令:它仅调用C预处理器。