为什么未定义预定义宏__STDC_VERSION__?

时间:2018-07-17 23:54:33

标签: c visual-c++ c99

我想知道我的Visual Studio C ++当前正在使用哪个C标准,但是在使用__STDC_VERSION__预定义宏和其他C99预定义宏时遇到了麻烦-出现错误,表明未定义此标识符当我使用#ifndef __STDC_VERSION__时,似乎没有定义。这是否表示我正在使用ANSI C?

以下是使用__STDC_VERSION__的示例代码:

int main(void) {
   printf("%d\n", __STDC_VERSION__);
   return 0;
}

1 个答案:

答案 0 :(得分:4)

Visual C ++完全支持的唯一C标准是ANSI-89 / ISO-90第一标准。 C99或C11没有官方支持;但是支持C99足以使C ++ 11和C ++ 14正常工作。

我用于源代码可移植性的是#ifdef _MSC_VER,并且如果定义了它,则仅期望C89 / C90支持。 (如果需要更详细的信息,可以测试_MSC_VER的值以查看哪个版本。维基百科上有list of MSC/C++ versions and their _MSC_VER values

显然,这必须在任何C99或C11宏之前进行测试。需要特别注意的是,如果Microsoft编译器定义了__STDC__,那么您甚至不会获得对C99的部分支持。仅当使用/Za选项进行编译时才定义该宏,该选项将禁用任何Microsoft扩展-包括诸如//注释的C ++ / C99位,块中的混合声明和代码或{{1中的声明}}语句。