c89和POSIX在同一时间

时间:2014-02-18 23:36:53

标签: c posix

即使在严格的std = c89中也可以使用POSIX功能吗?当我尝试在严格的ANSI C模式下在Linux上编译可执行文件时,gcc和clang都不知道readlinkrealpath之类的函数,尽管包含了标题。由于我必须在ANSI C模式下使用POSIX函数,我正在寻找方法。我考虑过dlsym,但我不知道我要打开哪个库。这些呼叫被#ifdef包围,因此它们不会在另一个系统上发出警报。需要跨平台解决方案。提前谢谢!

2 个答案:

答案 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的数字已经更改。