如何让GCC和Clang在C标准模式下拒绝__typeof__?
关于
__typeof__编译不报错的问题解答 你说得没错,__typeof__确实不属于任何C标准(包括C17),它是GCC和Clang实现的GNU扩展特性。你用现有编译选项没触发错误,核心原因是:
现有选项的局限
-pedantic-errors、-Wall这类选项会对违反C标准的通用语法抛出错误或警告,但对于编译器以双下划线开头的专属扩展(比如__typeof__),标准本身预留了双下划线开头的标识符作为实现扩展使用,因此默认情况下,即使开启严格标准模式,编译器也不会拦截这类扩展的使用。
禁用__typeof__的具体方法
针对GCC和Clang,需要添加专门禁用GNU扩展的选项:
GCC
添加 -fno-gnu-keywords 选项,该选项会直接禁用所有GNU特有的关键字扩展,包括__typeof__。完整编译命令示例:
gcc -std=c17 -pedantic-errors -Wall -Wextra -fno-gnu-keywords test.c
Clang
Clang支持和GCC一致的 -fno-gnu-keywords 选项,也可以用 -Werror=gnu-keyword-extension 把这类扩展的使用转为错误。示例命令:
clang -std=c17 -pedantic-errors -Wall -Wextra -fno-gnu-keywords test.c
或者:
clang -std=c17 -pedantic-errors -Wall -Wextra -Werror=gnu-keyword-extension test.c
内容的提问来源于stack exchange,提问作者JtTest
相关产品推荐
相关产品推荐

