在 VS2015 中使用 cl 编译器的 C vs C++

Posted

技术标签:

【中文标题】在 VS2015 中使用 cl 编译器的 C vs C++【英文标题】:C vs C++ using cl compiler in VS2015 【发布时间】:2015-09-10 14:56:04 【问题描述】:

cl 编译器如何知道我是在编译 C 代码还是 C++ 代码? 我需要告诉编译器吗? 我用完了 VS2015 的开发人员命令提示符。我最初使用在 RedHat Linux PC 上编译和运行的 c++ 代码开始了这个项目。我将它移到了 WIN7,它不会在 cl 编译器下编译,除非我摆脱了 c++ 结构并实现了 C 等价物。 头文件中的构造函数是我必须解决的问题之一。

【问题讨论】:

通常按文件扩展名。 C 源文件往往以 .c 结尾,而 C++ 有几个替代方案(.cpp 很常见)。 我相信这两个答案现在都可以回答这个问题了。 【参考方案1】:

正如in MSDN 所记录的,它首先查看文件扩展名。如果是 .cpp 或 .cxx 则默认为 C++ 编译。几乎总是足以完成工作。同一页面还显示了如何强制选择,对 C 使用 /Tc,对 C++ 使用 /Tp。您可以使用 /TC 和 /TP 来强制所有源文件使用它。

【讨论】:

【参考方案2】:

文件扩展名将提供该信息。

.c 文件用于 C 和 .cpp 文件用于 C++。详情请查看this link。

另外,我发现此代码 here 显示是否使用了 CC++ 编译器:

下面的代码包含运行时使用的标准预定义宏 确定是使用 C 还是 C++ 编译器来编译代码。 对于 C 编译器,它还决定了 C 语言的版本 编译器实现的标准)。注意:有些人喜欢 使用 STDC_HEADERS 而不是 STDC..

#ifdef __cplusplus
 printf("C++ compiler\n");
#else
#ifdef __STDC__
#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) ||/*continue..
    ...on the next line */ (defined(__GNUC__) && !defined(__STRICT_ANSI__))
 printf("ANSI X3.159-1999 / ISO 9899:1999 (C99) compiler\n");
#else
 printf("ANSI X3.159-1989 (C89) / ISO/IEC 9899:1990 (C90) C compiler\n");
#endif
#else
 printf("Pre-ANSI (K&R) C compiler\n");
#endif
#endif

下面的代码确定是使用 C 还是 C++ 编译器 在运行时编译代码:

if (sizeof('c') != sizeof(int)) printf("C++ compiler\n");
else if ((unsigned char)1 < -1) printf("Pre-ANSI (K&R) C compiler\n");
else  int i;   i = 1 //* */
 +1;
if (i == 2) printf("ANSI X3.159-1999 / ISO 9899:1999 (C99) compiler\n");
else printf("ANSI X3.159-1989 (C89) / ISO/IEC 9899:1990 (C90) C compiler\n");

不要完全依赖链接,以下是文档中的信息:

备注

默认情况下,CL 假定扩展名为 .c 的文件是 C 源代码 带有 .cpp 或 .cxx 扩展名的文件和文件是 C++ 源代码 文件。当指定 TC 或 Tc 选项时,任何规范 /Zc:wchar_t (wchar_t 是本机类型) 选项被忽略。设置 Visual Studio 开发环境中的这个编译器选项

    打开项目的属性页对话框。有关详细信息,请参阅如何 至:Open Project Property Pages. 点击C/C++文件夹。 点击高级属性页。 修改编译为属性。

还有一个例子,也取自文档。

以下 CL 命令行指定 TEST1.c、TEST2.cxx、 TEST3.huh 和 TEST4.o 编译为 C++ 文件,TEST5.z 为 编译为 C 文件。

CL TEST1.C TEST2.CXX TEST3.HUH TEST4.O /Tc TEST5.Z /TP

【讨论】:

那个宏告诉我我的 C11 编译器是 C99 编译器。 那是因为该代码是在 2008 年编写的。因此只需稍加修改即可显示它是否为 C11。

以上是关于在 VS2015 中使用 cl 编译器的 C vs C++的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 中编译与在命令行中使用 cl 编译

VS2019 中的 Clang 选项

如何使用 VS 编译器将预处理文件编译成目标文件

windows10 vs2015 怎么配置cl.exe环境变量

如何用vs08编译ffmpeg

VS2008 编译时出现的错误:无法打开编译器中间文件。如何解决?