编译时检查-fsingle-precision-constant:如何生成明确错误提示?
确保代码必须用
-fsingle-precision-constant编译的方法 这里有几种比你原方案更直观、错误信息更清晰的方法:
1. C11及以上:用静态断言(最推荐)
静态断言可以直接在编译期检查条件,并输出自定义的明确错误提示,完全匹配你的需求:
_Static_assert(sizeof(float) == sizeof(1.0), "请使用-fsingle-precision-constant选项编译本代码!");
当未开启该选项时,GCC会直接输出你定义的提示:
error: static assertion failed: 请使用-fsingle-precision-constant选项编译本代码!
2. 兼容C99及更早版本:结合条件编译与#error
如果需要适配旧标准,用条件编译判断后直接抛出#error,错误信息同样清晰:
#if !(sizeof(float) == sizeof(1.0)) #error 必须添加-fsingle-precision-constant编译选项! #endif
未开启选项时,编译器会直接显示这条自定义错误,比你原来的数组报错好理解得多。
原代码的问题说明
你之前写的数组方式int assert_float32_literals[1/(sizeof(float) == sizeof 1.0)];错误信息模糊,是因为当条件不成立时,分母为0,数组大小变成非法的非常量表达式,编译器只会报“文件作用域中可变修改的数组”,根本不会关联到编译选项的问题,完全达不到提示目的。
内容的提问来源于stack exchange,提问作者Wolf
相关产品推荐
相关产品推荐

