如何在C++代码中检测编译flag,判断是否使用/fp:precise或/fp:fast编译
C++编译时flags检测及/fp参数判断方法
通用原理
- C++标准没有定义统一的编译参数检测规范,但主流编译器都会提供专属的预定义宏暴露编译配置信息,可以通过检测这些宏实现编译参数的编译期判断,不需要运行时额外开销。
MSVC /fp系列参数的检测方法
你提到的/fp:precise和/fp:fast是微软MSVC编译器专属的浮点编译选项,直接检测MSVC预定义的浮点模式宏即可:
- 启用
/fp:fast时,宏_M_FP_FAST会被定义 - 启用
/fp:precise时(这是MSVC的默认浮点模式),宏_M_FP_PRECISE会被定义 - 启用
/fp:strict时,宏_M_FP_STRICT会被定义
以上三个宏互斥,同一时间只会有一个被定义。
代码示例
#include <iostream> int main() { #if defined(_M_FP_FAST) std::cout << "当前编译使用了 /fp:fast 参数" << std::endl; #elif defined(_M_FP_PRECISE) std::cout << "当前编译使用了 /fp:precise 参数" << std::endl; #elif defined(_M_FP_STRICT) std::cout << "当前编译使用了 /fp:strict 参数" << std::endl; #else std::cout << "当前使用了未识别的浮点编译配置" << std::endl; #endif return 0; }
补充说明
- 上述宏仅适用于MSVC编译器,如果你使用GCC/Clang,判断是否启用快速浮点模式可以检测
__FAST_MATH__宏。 - 所有检测逻辑都在预处理阶段完成,生成的运行时代码不会有额外的判断开销。
内容的提问来源于stack exchange,提问作者Richard Keene
相关产品推荐
相关产品推荐

