我正在为一个使用gcc-arm-none-eabi-8-2019-q3-update
作为编译器的嵌入式系统进行C/C++项目。
我添加了time.h
的strptime
函数的使用,但最初它是未定义的,我在编译器中发现包含:
#if __XSI_VISIBLE
...strptime...
#endif
所以,我解决了这个问题:
#undef __XSI_VISIBLE
#define __XSI_VISIBLE 1
#include <time.h>
#undef __XSI_VISIBLE
#define __XSI_VISIBLE 0
现在它工作,但是:
- 我做了什么?
- 什么是__XSI_可见?
- 这是干什么用的?
- 为什么这个编译器在默认情况下将它保持为0?
2条答案
按热度按时间z9ju0rcb1#
从https://pubs.opengroup.org/onlinepubs/9699919799/开始:
X/Open System Interfaces(XSI)选项是C和sh编程的核心应用程序编程接口,适用于符合单一UNIX规范的系统。这是符合POSIX. 1 - 2017的强制性要求的超集。
__XSI_VISIBLE
宏为"vanilla" POSIX接口提供了可见的扩展,否则这些接口将被禁止出现在名称空间中。(在ISO C和"vanilla" POSIX中,strptime
不被保留,你可以用这个名字写一个函数,并且不受它的干扰)。通过定义所谓的"特性测试宏",你扩展了标准标识符的集合,减少了应用程序员可以定义的标识符。您的编译器将其保持为0,因为实现供应商选择应用程序员的工作是在他/她需要时启用XSI。应用程序员通过在包含头之前定义所需的特性测试宏来实现这一点,例如,使用
或者将
-D__XSI_VISIBLE=1
传递给编译器。j5fpnvbx2#
要使用的正确定义是
-D_XOPEN_SOURCE=1
和-D_GNU_SOURCE=1
。它们分别用于在<sys/features.h>
中有条件地定义__XSI_VISIBLE
和__GNU_VISIBLE
。定义__XSI_VISIBLE
和__GNU_VISIBLE
并不总是有效,因为它们在<sys/features.h>
中被覆盖。