gcc 什么是__XSI_可见?

jq6vz3qz  于 2023-01-26  发布在  其他
关注(0)|答案(2)|浏览(173)

我正在为一个使用gcc-arm-none-eabi-8-2019-q3-update作为编译器的嵌入式系统进行C/C++项目。
我添加了time.hstrptime函数的使用,但最初它是未定义的,我在编译器中发现包含:

#if __XSI_VISIBLE
 ...strptime...
#endif

所以,我解决了这个问题:

#undef __XSI_VISIBLE
#define __XSI_VISIBLE 1
#include <time.h>
#undef __XSI_VISIBLE
#define __XSI_VISIBLE 0

现在它工作,但是:

  • 我做了什么?
  • 什么是__XSI_可见?
  • 这是干什么用的?
  • 为什么这个编译器在默认情况下将它保持为0?
z9ju0rcb

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。应用程序员通过在包含头之前定义所需的特性测试宏来实现这一点,例如,使用

#define _POSIX_SOURCE
#define __XSI_VISIBLE 1
#include <time.h>

或者将-D__XSI_VISIBLE=1传递给编译器。

j5fpnvbx

j5fpnvbx2#

要使用的正确定义是-D_XOPEN_SOURCE=1-D_GNU_SOURCE=1。它们分别用于在<sys/features.h>中有条件地定义__XSI_VISIBLE__GNU_VISIBLE。定义__XSI_VISIBLE__GNU_VISIBLE并不总是有效,因为它们在<sys/features.h>中被覆盖。

相关问题