即使在严格的std=c89中也可以使用POSIX函数吗?当我试图在Linux上以严格的ANSI C模式编译可执行文件时,gcc和clang都不知道像readlink或realpath这样的函数,尽管其中包括了头。由于我必须使用POSIX函数,即使在ANSI C模式下,我也在寻找方法来实现它。我想过dlsym,但我不知道我要开哪个图书馆。这样的呼叫被#ifdef包围,因此它们不会在另一个系统上发出警报。需要跨平台的解决方案。提前感谢!
发布于 2014-02-19 00:04:07
你在找“特性测试宏”。请参阅单一Unix规范,第6期:系统接口,第2.2章,“编译环境”
编辑:
引用这一页的话:
_POSIX_C_SOURCE特征测试宏 符合POSIX的应用程序应该确保在包含任何标头之前定义了特性测试宏_POSIX_C_SOURCE。
GCC和clang目前默认为您定义_POSIX_C_SOURCE,除非将c89、c99、c11或任何行为等效字符串传递给编译器的-std选项。
此外:
_XOPEN_SOURCE特征测试宏 符合XSI标准的应用程序应确保在包含任何标头之前使用值600定义特性测试宏_XOPEN_SOURCE。为了启用_POSIX_C_SOURCE特性测试宏中描述的功能,以及启用XSI扩展,需要这样做。
换句话说,以保证您的程序(a.k.a。应用程序)可以使用POSIX,可以在包含任何标头之前使用#define _POSIX_C_SOURCE 200112L,也可以将-D_POSIX_C_SOURCE=200112L选项传递给编译器。对于XSI功能,必须将_XOPEN_SOURCE定义为600。
还有一个更新版本的单一Unix规范-问题7. 类似的文本可在第7期中找到。。与上面的文本相比,唯一真正的区别是_POSIX_C_SOURCE和_XOPEN_SOURCE的数字已经改变了。
发布于 2014-02-18 23:52:00
至少当gcc和glibc在linux上结合使用时,您可以用#define打开非标准函数(例如,由posix定义的函数),请参阅man 宏。
例如,在包含任何头文件之前,或者通过将其添加到编译器参数中,#define _POSIX_C_SOURCE 200809L:
gcc -std=c99 -D_POSIX_C_SOURCE=200809L ... https://stackoverflow.com/questions/21867897
复制相似问题