sizeof能否用于#if预处理条件中?为何编译报错?
问题
根据CPPReference的说明,#if预处理指令后需跟常量表达式,sizeof是常量表达式中的合法运算符。但编写如下代码并使用clang或gcc编译时会失败:
#if sizeof(char) == 1 #endif
clang编译输出:
sizeof in preprocessor directive.c:1:5: error: function-like macro 'sizeof' is not defined #if sizeof(char) == 1 ^ 1 error generated.
gcc编译输出:
sizeof in preprocessor directive.c:1:11: error: missing binary operator before token "(" 1 | #if sizeof(char) == 1 | ^
请问是CPPReference的说明有误,还是编译器存在问题?
解答
既不是CPPReference的说明有误,也不是编译器存在问题——核心原因是混淆了预处理阶段的条件表达式和C语言编译阶段的常量表达式。
预处理与编译阶段完全分离:
#if使用的是预处理条件表达式,它的语法规则独立于C语言本身的常量表达式。预处理阶段只识别预处理宏、defined这类专属运算符,以及基础算术/逻辑运算,完全不认识C语言的sizeof运算符。- 你写的
sizeof(char)会被预处理阶段误判为未定义的函数式宏,这就是clang和gcc报错的直接原因。
正确的实现方式:
如果需要在预处理阶段判断类型大小,可以使用编译器提供的预定义宏,比如__SIZEOF_CHAR__(gcc、clang均支持):#if __SIZEOF_CHAR__ == 1 #endif
额外补充:C标准明确规定sizeof(char)的结果恒为1,所以这个判断本身没有实际意义,但这个例子清晰体现了预处理与编译阶段的语法差异。
内容的提问来源于stack exchange,提问作者schuelermine
相关产品推荐
相关产品推荐

