【问题标题】:Compiling a CPP program with a .c extension [duplicate]编译带有.c扩展名的CPP程序[重复]
【发布时间】:2021-01-30 03:35:54
【问题描述】:

今天我不小心在 CPP 程序上添加了扩展名“.c”(其中包含命名空间、类和其他内容)并将其传递给 g++。它编译它没有问题,但它不应该将它视为 C 程序并抛出错误或警告吗?在其他线程上,我读到 g++ 的扩展名无关紧要(有些人建议使用任何未采用的任意扩展名,但是我尝试了标准 .c、.C、.cpp 等之外的其他扩展名)并且它们未被识别。

那么,扩展程序到底发生了什么?我的 cpp 程序是编译成 cpp 程序还是 c 程序?

【问题讨论】:

  • 你是如何调用编译器的?你到底在命令行上输入了什么?
  • 如果您使用gcc 工具链驱动程序而不是g++ 工具链驱动程序会发生什么?
  • 这能回答你的问题吗? stackoverflow.com/questions/172587/…
  • 我只是像这样使用 g++ 编译它,g++ -o pr.o pr.c 并且编译得很好。此外,使用 GCC 根本不起作用(意味着它不会编译)。值得注意的是,我是在 WSL 上编译的,不确定它是否有所作为。
  • 对提议的欺骗的答案解释了 gcc 上的哪些标志或多或少相当于只调用 g++

标签: c++ g++


【解决方案1】:

它编译它没有问题,但它不应该将它视为一个 C 程序

不,不应该。 g++ 默认将带有 .c 后缀的文件视为 C++ 源代码。

我的 cpp 程序是否被编译为 cpp 程序?

是的。

在其他线程上,我读到 g++ 的扩展无关紧要

这并不完全正确。 g++ 确实会根据文件后缀检测语言,但如果检测到 C,则默认使用 C++ 编译文件。可以通过指定 -x LANG 选项来覆盖默认值。 g++ -x none 会以与 gcc 相同的方式检测语言。

【讨论】:

  • 因此,无论 g++ 是否会将任何兼容的源文件编译为 c++ 程序。但是,如果 suffix 是 .py 之类的东西,它就不会编译,那么它不关心后缀的想法从何而来?参考这个:stackoverflow.com/questions/31369583/…
  • @pol 可能是因为 .c 被编译为 C++。如果您只测试过 .c 和 .cpp 后缀,那么您可能会得出后缀无关紧要的误导性结论。或者,答案可能是从 if 您为编译器指定语言 then 后缀无关紧要的角度编写的。实际上,后缀仅在推断语言的情况下才重要。
【解决方案2】:

由于您尚未在此处发布您的代码,我假设其中不包含任何仅对 g++ 编译器具有特权的特殊库。 根据您的查询,gcc 可以很好地编译 c++ 代码,因为它会根据文件扩展名选择最佳编译器,同样的事情可以说是 g++ 编译器编译 C 虽然它只编译 .c 和 .cpp 代码作为 c++。

最后,我会说这不是一个好习惯,可能会导致链接器问题(某些函数或库丢失错误)。 即使你想要那么糟糕,如果你将编译行更改为这个也可以工作

gcc <file_name>.c -lstdc++

【讨论】:

  • 其实我现在的代码里面确实有iostream和命名空间,所以gcc根本无法编译。
猜你喜欢
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 2018-08-28
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多