gpt4 book ai didi

c++ - 在编译器之前检测未声明的标识符

转载 作者:行者123 更新时间:2023-11-28 04:31:57 48 4
gpt4 key购买 nike

我正在开发一个多平台代码库,在其中一个平台上,sprintf_s 不可用,但 snprintf 确实存在,所以在这种情况下解决方案是让线路

#define sprintf_s snprintf

但是,如果平台实现 sprintf_s,我想自动还原它(或抛出编译时错误以便我可以手动执行)。

我在这里发现了多个问题来检测一个类是否定义了成员函数(或流运算符是否存在重载),但对于像 sprintf_s 这样的函数没有任何问题。

(我宁愿不使用任何实验性的东西,但如果 std::experimental::is_detected 是唯一的解决方案,那就这样吧)。

理想的解决方案看起来像

if !sprintf exists
#define sprintf_s snprintf

但是像下面这样的东西也是可以接受的

static_assert(!sprintf_s_exists, "sprintf_s is now defined");

最佳答案

提供 sprintf_s() 的实现应该定义宏 __STDC_LIB_EXT1__<stdio.h> .您还可以定义 __STDC_WANT_LIB_EXT1__1在自己包含 header 之前。

您还可以检查您确定支持它的实现,例如具有最低版本号的 MSVC,并仅有条件地为那些启用它。

更一般的方法是 auticonf 传统上所做的:尝试编译一个调用您正在测试的函数的小程序,并检查返回值。如果程序按预期编译和运行,则脚本添加了一个宏,例如 HAS_SPRINTF_S添加到配置文件,然后程序可以对其进行测试。

关于c++ - 在编译器之前检测未声明的标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52624302/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com