什么是 __XSI_VISIBLE?

What is __XSI_VISIBLE?

我正在为使用 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

现在可以了但是:

来自https://pubs.opengroup.org/onlinepubs/9699919799/

The X/Open System Interfaces (XSI) option is the core application programming interface for C and sh programming for systems conforming to the Single UNIX Specification. This is a superset of the mandatory requirements for conformance to POSIX.1-2017.

__XSI_VISIBLE 宏对 "vanilla" POSIX 接口进行可见扩展,否则将被禁止出现在名称 space 中。请记住,像 ISO C 和 POSIX 这样的 C 语言标准允许应用程序定义所有 non-standard 标识符(在 ISO C 和 "vanilla" POSIX 中,strptime 不保留, 你可以用那个名字写一个函数并且让它不受干扰)。通过定义 so-called 功能测试宏 您可以扩展标准标识符集并减少应用程序程序员可以定义的标识符。

您的编译器将其保持为 0,因为实现供应商选择在 s/he 需要时启用 XSI 是应用程序程序员的工作。应用程序程序员通过在包含 header 之前定义所需的功能测试宏来做到这一点,例如与

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

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