1

我正在gcc-arm-none-eabi-8-2019-q3-update为用作编译器的嵌入式系统开发 C/C++ 项目。

我添加了strptime函数的使用,time.h但最初它是未定义的,我在编译器包含中找到:

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

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

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

现在它可以工作但是:

  • 我做了什么?
  • 什么是 __XSI_VISIBLE?
  • 它是干什么用的?
  • 为什么这个编译器默认保持为 0?
4

1 回答 1

1

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

X/Open System Interfaces (XSI) 选项是 C 和 sh 编程的核心应用程序编程接口,适用于符合单一 UNIX 规范的系统。这是符合 POSIX.1-2017 的强制性要求的超集。

__XSI_VISIBLE宏对“vanilla”POSIX 接口进行了可见的扩展,否则这些接口将被禁止出现在名称空间中。请记住,像 ISO C 和 POSIX 之类的 C 语言标准允许应用程序定义所有非标准标识符(在 ISO C 和“vanilla”POSIX 中,strptime不是保留的,您可以使用该名称编写一个函数并且让它不干扰)。通过定义所谓的功能测试宏,您可以扩展标准标识符集并减少应用程序程序员可以定义的标识符。

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

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

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

于 2020-05-09T15:31:37.023 回答