Gcc 什么是可见的?

Gcc 什么是可见的?,gcc,arm,eabi,Gcc,Arm,Eabi,我当时正在为一个嵌入式系统开发一个C/C++项目,该项目使用gcc-arm-none-eabi-8-2019-q3-update作为编译器 我添加了time.h函数的strtime用法,但最初它没有定义,我在编译器中发现: #if __XSI_VISIBLE ...strptime... #endif 因此,我用以下方法解决了问题: #undef __XSI_VISIBLE #define __XSI_VISIBLE 1 #include <time.h> #undef __XS

我当时正在为一个嵌入式系统开发一个C/C++项目,该项目使用
gcc-arm-none-eabi-8-2019-q3-update
作为编译器

我添加了
time.h
函数的
strtime
用法,但最初它没有定义,我在编译器中发现:

#if __XSI_VISIBLE
 ...strptime...
#endif
因此,我用以下方法解决了问题:

#undef __XSI_VISIBLE
#define __XSI_VISIBLE 1
#include <time.h>
#undef __XSI_VISIBLE
#define __XSI_VISIBLE 0
#未定义uuxsi_可见
#定义uuxsi_可见1
#包括
#未定义uuxsi_可见
#定义uuxsi_可见0
现在它可以工作了,但是:

  • 我做了什么
  • 什么是可见的
  • 这是干什么用的
  • 为什么此编译器在默认情况下将其保持为0
来自:

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

\uuuxsi\u VISIBLE
宏对“普通”POSIX接口进行可见扩展,否则将被禁止在名称空间中。请记住,像ISO C和POSIX这样的C语言标准允许应用程序定义所有非标准标识符(在ISO C和“香草”POSIX中,
strtime
不是保留的,您可以使用该名称编写函数,并且不受干扰)。通过定义所谓的功能测试宏,可以扩展标准标识符集,并减少应用程序程序员可以定义的标识符集

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

#define _POSIX_SOURCE
#define __XSI_VISIBLE 1
#include <time.h>
#定义POSIX_SOURCE
#定义uuxsi_可见1
#包括
或者将
-D_uxsi_VISIBLE=1
传递给编译器