C++ 编译扩展名为.c的CPP程序

C++ 编译扩展名为.c的CPP程序,c++,g++,C++,G++,今天,我意外地在一个CPP程序上添加了扩展名“.c”(里面有名称空间、类等等),并将其传递给了g++。它编译它时没有任何问题,但它不应该把它当作一个C程序,并抛出一个错误或警告吗?在其他线程上,我读到g++的扩展并不重要(一些人建议使用任何未采用的任意扩展,但是我尝试了标准.c、.c、.cpp等中的其他扩展辅助),它们不被识别 那么,扩展到底发生了什么?我的cpp程序编译为cpp程序还是c程序 它编译它没有问题,但它不应该把它当作一个C程序吗 不,不应该。g++在默认情况下将.C后缀的文件视为C

今天,我意外地在一个CPP程序上添加了扩展名“.c”(里面有名称空间、类等等),并将其传递给了g++。它编译它时没有任何问题,但它不应该把它当作一个C程序,并抛出一个错误或警告吗?在其他线程上,我读到g++的扩展并不重要(一些人建议使用任何未采用的任意扩展,但是我尝试了标准.c、.c、.cpp等中的其他扩展辅助),它们不被识别

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

它编译它没有问题,但它不应该把它当作一个C程序吗

不,不应该。g++在默认情况下将.C后缀的文件视为C++源。 我的cpp程序是否编译为cpp程序

在其他线程上,我读到g++的扩展并不重要


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

由于您尚未在此处发布代码,我假设其中没有任何仅对g++编译器具有特权的特殊库。 根据您的查询,C++代码可以由GCC编译,因为它选择了基于文件扩展的最佳编译器,并且可以对编译C的C++编译器进行同样的处理,尽管它编译了C和.CPP代码,就像C++。 最后,我要说的是,这不是一个好的做法,可能会导致链接器出现问题(一些函数或库缺少错误)。 即使您非常希望这样,如果您将编译行更改为

gcc <file_name>.c -lstdc++
gcc.c-lstdc++

您是如何调用编译器的?您在命令行上到底键入了什么?如果使用
gcc
工具链驱动程序而不是
g++
工具链驱动程序,会发生什么情况?这是否回答了您的问题?我只是用g++编译它,就像这样,g++-opr.opr.c,编译得很好。此外,使用GCC根本不起作用(这意味着它不会编译)。值得注意的是,我在WSL上编译了它,不确定它是否有区别。建议的dupe上的答案解释了gcc上的哪些标志或多或少等同于只调用g++实际上,我当前的代码中确实包含iostream和名称空间,所以它根本不能由gcc编译。因此,不管G++如何编译任何兼容的源文件都是C++程序。然而,如果后缀类似于.py,它就不会编译,那么它不关心后缀的想法从何而来?引用这个词:@ POL可能是从C编译为C++的事实。如果您只测试.c和.cpp后缀,那么您可能会得出一个误导性的结论,即后缀并不重要。或者,答案可能是从这样一个角度写的:如果您向编译器指定了语言,那么后缀就无关紧要了。事实上,后缀只有在语言被推导的情况下才起作用。