即使在严格的std = c89中也可以使用POSIX功能吗?当我尝试在严格的ANSI C模式下在Linux上编译可执行文件时,gcc和clang都不知道readlink
或realpath
之类的函数,尽管包含了标题。由于我必须在ANSI C模式下使用POSIX函数,我正在寻找方法。我考虑过dlsym
,但我不知道我要打开哪个库。这些呼叫被#ifdef包围,因此它们不会在另一个系统上发出警报。需要跨平台解决方案。提前谢谢!
答案 0 :(得分:2)
至少在linux上使用gcc和glibc的组合时,你可以用#define
打开非标准函数(例如posix定义的函数),参见man feature_test_macros
e.g。在包含任何头文件之前,或者通过将其添加到编译器参数中来#define _POSIX_C_SOURCE 200809L
:
gcc -std=c99 -D_POSIX_C_SOURCE=200809L ...
答案 1 :(得分:2)
您正在寻找"功能测试宏"。见the Single Unix Specification, Issue 6: System Interfaces Chapter 2.2, "The Compilation Environment"
编辑:
引用该页面:
_POSIX_C_SOURCE功能测试宏
符合POSIX的应用程序应确保功能测试宏 _POSIX_C_SOURCE在包含任何标题之前定义。
GCC和clang目前默认为您定义_POSIX_C_SOURCE,除非将c89,c99,c11或任何行为等效字符串中的一个传递给编译器的-std选项。
此外:
_XOPEN_SOURCE功能测试宏
符合XSI的应用程序应确保功能测试宏 在包含任何标头之前,_XOPEN_SOURCE定义为值600。 这是启用_POSIX_C_SOURCE中描述的功能所必需的 功能测试宏以及启用XSI扩展。
换句话说,为了保证您的程序(a.k.a.应用程序)可以使用POSIX,在包含任何标头之前#define _POSIX_C_SOURCE 200112L
或将-D_POSIX_C_SOURCE=200112L
选项传递给编译器。对于XSI功能,您必须将_XOPEN_SOURCE
定义为值600。
还有一个较新版本的单Unix规范 - 问题7. Very similar text can be found in Issue 7。与上述文本相关的唯一真正差异是_POSIX_C_SOURCE和_XOPEN_SOURCE的数字已经更改。