宏:ISO_C_可见

宏:ISO_C_可见,c,macros,C,Macros,此宏的用途是什么:ISO_C_VISIBLE?我在assert.h文件中找到了它 它被用来知道我们使用的是哪个C版本吗?谷歌搜索“ISO_C_VISIBLE”时,出现了这个问题和一些针对诺基亚Symbian操作系统的搜索结果。报告说: __国际标准化组织1999年 描述 要为ISO_C_VISIBLE启用的宏值 我的猜测是1999这个值指的是1999年的ISO C标准,但我看不到对它的含义或使用方式的进一步解释,也看不到\u ISO\u C\u VISIBLE和ISO\u C\u VISIBLE

此宏的用途是什么:
ISO_C_VISIBLE
?我在
assert.h
文件中找到了它

它被用来知道我们使用的是哪个C版本吗?

谷歌搜索“ISO_C_VISIBLE”时,出现了这个问题和一些针对诺基亚Symbian操作系统的搜索结果。报告说:

__国际标准化组织1999年

描述

要为ISO_C_VISIBLE启用的宏值

我的猜测是
1999
这个值指的是1999年的ISO C标准,但我看不到对它的含义或使用方式的进一步解释,也看不到
\u ISO\u C\u VISIBLE
ISO\u C\u VISIBLE
之间的区别。这似乎很奇怪,因为Symbian主要是在C++中实现和编程,而不是C。我当然不会期望它在<代码> <代码>中定义(假设当你说“代码>断言。h < /Cord>”时,你指的是包含在<代码>中的头包含< <代码> >。< /P> 如果你没有使用Symbian,那么我不知道它可能是什么

确定实现符合哪个C标准的正确方法是使用预定义的STDCSTDC\u版本宏。对于一致性C90或更高版本的实现,
\uuu STDC\uuuu
扩展为
1
。对于C99实现,
\uu STDC\u VERSION\uu
扩展为
199901L
。对于C11,它可能会扩展到
201112L
,但我还没有看到新标准的实际副本。

谷歌搜索“ISO_C_VISIBLE”时,出现了这个问题以及诺基亚Symbian操作系统的一些结果。报告说:

__国际标准化组织1999年

描述

要为ISO_C_VISIBLE启用的宏值

我的猜测是
1999
这个值指的是1999年的ISO C标准,但我看不到对它的含义或使用方式的进一步解释,也看不到
\u ISO\u C\u VISIBLE
ISO\u C\u VISIBLE
之间的区别。这似乎很奇怪,因为Symbian主要是在C++中实现和编程,而不是C。我当然不会期望它在<代码> <代码>中定义(假设当你说“代码>断言。h < /Cord>”时,你指的是包含在<代码>中的头包含< <代码> >。< /P> 如果你没有使用Symbian,那么我不知道它可能是什么


确定实现符合哪个C标准的正确方法是使用预定义的STDCSTDC\u版本宏。对于一致性C90或更高版本的实现,
\uuu STDC\uuuu
扩展为
1
。对于C99实现,
\uu STDC\u VERSION\uu
扩展为
199901L
。对于C11,它可能扩展到
201112L
,但我还没有看到新标准的实际副本。

这些宏用于配置编译代码的系统。从编译器收集的信息存储在它们中,因此代码是根据托管平台支持的构造进行[成形]的

/* ... */
#ifdef _POSIX_C_SOURCE
#if _POSIX_C_SOURCE >= 200112
#define __POSIX_VISIBLE     200112
#define __ISO_C_VISIBLE     1999
#elif _POSIX_C_SOURCE >= 199506
#define __POSIX_VISIBLE     199506
/* ... */

这些宏用于配置编译代码的系统。从编译器收集的信息存储在它们中,因此代码是根据托管平台支持的构造进行[成形]的

/* ... */
#ifdef _POSIX_C_SOURCE
#if _POSIX_C_SOURCE >= 200112
#define __POSIX_VISIBLE     200112
#define __ISO_C_VISIBLE     1999
#elif _POSIX_C_SOURCE >= 199506
#define __POSIX_VISIBLE     199506
/* ... */
下面是安对
\uu ISO\u C\u VISIBLE
和一些相关宏的看法:

/*
 * "The nice thing about standards is that there are so many to choose from."
 * There are a number of "feature test macros" specified by (different)
 * standards that determine which interfaces and types the header files
 * should expose.
 *
 * Because of inconsistencies in these macros, we define our own
 * set in the private name space that end in _VISIBLE.  These are
 * always defined and so headers can test their values easily.
 * Things can get tricky when multiple feature macros are defined.
 * We try to take the union of all the features requested.
 *
 * The following macros are guaranteed to have a value after cdefs.h
 * has been included:
 *  __POSIX_VISIBLE
 *  __XPG_VISIBLE
 *  __ISO_C_VISIBLE
 *  __BSD_VISIBLE
 */
该特定的
cdefs.h
根据配置的POSIX规范级别设置
\u ISO\u C\u可见

因此,BSD使用这些宏来尝试“压缩”Unix世界中使用的其他各种功能宏,以将构建环境配置为其他标头可以依赖的更易于管理的集合

例如,适当地设置
\uu ISO\u C\u VISIBLE
宏(用户将通过设置其他有文档记录的功能宏间接执行此操作)将允许名称与C99名称冲突的旧程序继续干净地编译-如果正确配置了生成,这些冲突的C99名称将不会被“激活”,在用户程序中使用这些名称不会发生冲突

如果在中查找该OpenBSD源代码,您将看到:

# if __ISO_C_VISIBLE >= 1999
#  define   assert(e)   ((e) ? (void)0 : __assert2(__FILE__, __LINE__, __func__, #e))
# else
#  define   assert(e)   ((e) ? (void)0 : __assert(__FILE__, __LINE__, #e))
# endif
因此,如果将构建配置为使用C99功能,则
assert
宏将利用C99的
\uuuuu func\uuuu
功能,因此断言将指示断言所处的函数。如果将构建配置为指示不应使用C99功能,
assert()
将不会这样做

请注意,这些宏不是通用标准-它们似乎主要存在于BSD世界,但我相信您会发现它们可能会被使用的其他领域(可能是因为文件是从BSD借来的)。

以下是an对
\u ISO\u C\u VISIBLE
和一些相关宏的看法:

/*
 * "The nice thing about standards is that there are so many to choose from."
 * There are a number of "feature test macros" specified by (different)
 * standards that determine which interfaces and types the header files
 * should expose.
 *
 * Because of inconsistencies in these macros, we define our own
 * set in the private name space that end in _VISIBLE.  These are
 * always defined and so headers can test their values easily.
 * Things can get tricky when multiple feature macros are defined.
 * We try to take the union of all the features requested.
 *
 * The following macros are guaranteed to have a value after cdefs.h
 * has been included:
 *  __POSIX_VISIBLE
 *  __XPG_VISIBLE
 *  __ISO_C_VISIBLE
 *  __BSD_VISIBLE
 */
该特定的
cdefs.h
根据配置的POSIX规范级别设置
\u ISO\u C\u可见

因此,BSD使用这些宏来尝试“压缩”Unix世界中使用的其他各种功能宏,以将构建环境配置为其他标头可以依赖的更易于管理的集合

例如,适当地设置
\uu ISO\u C\u VISIBLE
宏(用户将通过设置其他有文档记录的功能宏间接执行此操作)将允许名称与C99名称冲突的旧程序继续干净地编译-如果正确配置了生成,这些冲突的C99名称将不会被“激活”,在用户程序中使用这些名称不会发生冲突

如果在中查找该OpenBSD源代码,您将看到:

# if __ISO_C_VISIBLE >= 1999
#  define   assert(e)   ((e) ? (void)0 : __assert2(__FILE__, __LINE__, __func__, #e))
# else
#  define   assert(e)   ((e) ? (void)0 : __assert(__FILE__, __LINE__, #e))
# endif
因此,如果将构建配置为使用C99功能,则
assert
宏将利用C99的
\uuuuu func\uuuu
功能,因此断言将指示断言所处的函数。如果构建配置为指示不应使用C99功能,