有没有办法测试C标准库中是否有线程安全函数?
对于较新版本的C标准库,是否有跨平台的方法通过预处理器定义来判断它们是否可用?我指的是诸如有没有办法测试C标准库中是否有线程安全函数?,c,libc,C,Libc,对于较新版本的C标准库,是否有跨平台的方法通过预处理器定义来判断它们是否可用?我指的是诸如localtime\u r()之类的函数 如果没有标准方法,GCC中的可靠方法是什么?[编辑]或带有unistd.h的posix系统?没有标准的方法来测试它,这意味着无法在所有平台上测试它。像autoconf这样的工具将创建一个调用此函数的小型C程序,然后尝试编译和链接它。如果这样做,看起来函数存在,如果不存在,那么它可能不存在(或者编译器选项错误,需要设置相应的CFLAGS) 因此,您基本上有6种选择:
localtime\u r()
之类的函数
如果没有标准方法,GCC中的可靠方法是什么?[编辑]或带有unistd.h的posix系统?没有标准的方法来测试它,这意味着无法在所有平台上测试它。像
autoconf
这样的工具将创建一个调用此函数的小型C程序,然后尝试编译和链接它。如果这样做,看起来函数存在,如果不存在,那么它可能不存在(或者编译器选项错误,需要设置相应的CFLAGS
)
因此,您基本上有6种选择:
NULL
),或者使用类似dlsym()
(这也不是真正的可移植性,但在Linux/UNIX世界中得到广泛支持)。但是,在这种情况下,如果在运行时找不到该函数,则需要回退autoconf
的工具、其他具有类似功能的工具或您自己的配置脚本来确定这一点(并可能根据结果设置预处理器宏)。在这种情况下,您还需要一个回退解决方案这就是autoconf的初衷。最好使用autoconf。autoconf将为您创建测试。如上所述,但使用CMake;)如果可以用预处理器完成,他们就不必发明autoconf、CMake等。这些函数在POSIX中是必需的,因此如果
\POSIX\u VERSION
定义为与包含unistd.h
后的POSIX的合理最新版本相匹配的内容,这些函数必须可用。@vonbrand请参阅我的回复命令我确实很喜欢R.的评论,因为它在很多方面都符合我的问题。它基本上是对你的第(5)子部分的更具体的回答,这是我在GCC后续问题中得到的。谢谢你的写作,非常好!