C++ 有没有可能强制说,`gcc`,为C和C+中相同的源代码片段生成相同的二进制文件+;?

C++ 有没有可能强制说,`gcc`,为C和C+中相同的源代码片段生成相同的二进制文件+;?,c++,c,gcc,flags,C++,C,Gcc,Flags,假设有一个C程序,如下所示: int main(int argc, char** argv) { return 0; } 我有两个以上源代码的文件,一个扩展名为“c”,另一个扩展名为“cpp”。我把它们分别编译成C和C++程序。strong>二进制文件不同。我认为C++是“零开销”的语言?我试图找到的是两个不同设置的编译器标志,其中生成的二进制文件是相同的。最好是某种语言标准,而不是任何类型的GCC扩展。这只是“我的空main有多短”错误问题的另一个版本 “基础设施”中有一部分包含启动

假设有一个C程序,如下所示:

int main(int argc, char** argv)
{
    return 0;
}

我有两个以上源代码的文件,一个扩展名为“c”,另一个扩展名为“cpp”。我把它们分别编译成C和C++程序。strong>二进制文件不同。我认为C++是“零开销”的语言?我试图找到的是两个不同设置的编译器标志,其中生成的二进制文件是相同的。最好是某种语言标准,而不是任何类型的GCC扩展。

这只是“我的空main有多短”错误问题的另一个版本

“基础设施”中有一部分包含启动和结束代码以及标准库全局对象,这些对象在任何情况下都必须链接,无论程序实际是什么

测量一个空的主程序,实际上就是测量启动/结束代码的大小。C和C++中的C++必须不同,因为C++要做的事情比C实际上要做的要多。 我不知道你说的“零开销语言”是什么意思。C和C++都不存在。它们都将各自域中的开销降至最低。 根据定义,唯一的零开销语言是本机机器代码

二进制文件不同。

它们有何不同

GCC将在文件中嵌入有关原始源文件名和使用的选项的信息,因此对于不同的文件名,即使内容相同,也会有一些差异

<>如果我编译你的程序作为C和C++,我看到的唯一不同是C++版本链接到 LBSTDC++< /COD>,这在使用<代码> G++<代码>链接时自动发生。如果我改为使用
gcc
链接,那么二进制文件几乎相同

< N.B. >你可以使用<代码> GCC < /C>编译C++程序,<代码> GCC 和 G++< /COD>二进制文件只是驱动文件名并调用正确的编译器二进制(<代码> Cc1<代码> C,<代码> CcPult+<代码> C++)进行实际编译。有关更多详细信息,请参阅

这表明,对于相同的源代码,汇编器输出的唯一区别是给出原始文件名的字符串,并且目标文件大小相同:

$ cat f.c
cat: f.c: No such file or directory
$ rm f.c
$ cat > f.c
int main(int argc, char** argv)
{
    return 0;
}
$ ln -s f.c f.cc
$ gcc f.c -S -o f.c.s
$ g++ f.cc -S -o f.cxx.s
$ diff f.c*.s
--- f.c.s       2012-08-26 13:45:58.109711329 +0100
+++ f.cxx.s     2012-08-26 13:46:00.482634256 +0100
@@ -1,4 +1,4 @@
-       .file   "f.c"
+       .file   "f.cc"
        .text
        .globl  main
        .type   main, @function
$ gcc f.c -c -o f.c.o
$ g++ f.cc -c -o f.cxx.o
$ ls -l f.c*.o
-rw-rw-r--. 1 jwakely users 1240 Aug 26 13:46 f.c.o
-rw-rw-r--. 1 jwakely users 1240 Aug 26 13:46 f.cxx.o
在最终的可执行文件中,区别在于它是如何链接的,C++标准库是否链接到:

$ gcc f.c.o -o a.c.out
$ gcc f.cxx.o -o a.cxx.out
$ g++ f.cxx.o -o a.cxx.libstdcxx.out
$ ls -l a.c*.out
-rwxrwxr-x. 1 jwakely users 6323 Aug 26 13:48 a.c.out
-rwxrwxr-x. 1 jwakely users 6468 Aug 26 13:48 a.cxx.libstdcxx.out
-rwxrwxr-x. 1 jwakely users 6324 Aug 26 13:48 a.cxx.out

如果不需要C++标准库,不要链接到它。

当然是不同的,甚至像函数名这样的简单的东西也会被C和C++不同的处理。 C++中的代码>空余()/<代码>在C++中简单地是<代码> Foo< /Cord>,因为C版本没有足够的信息来处理多个FO函数,这些参数不同,如<代码> Vo.Foo(int)< /C>。p> 还有一些不同的标准库,它们在默认情况下是链接的,因为大多数c/c++程序都使用它们(对于您的零开销声明,这可以被禁用)

最重要的是关于定义良好的行为的不同规则,C++不是C的超集,而存在大量的重叠,它们有很多不同的情况。例如,在C和C++中,参见代码< > sieOf(a))/<代码> < /p>


结论:C和C++编译器从相同的源代码中生成相同的二进制文件,但不太可能发生。

使用外部“C”{}如何?C++不是零开销语言,C++的开销不是零,只是一般的规则“如果你不使用它,你就不用付费”。C和C++编译器不是同一个东西,所以你不必有不同的二进制文件。没有理由,一个空程序在C++中需要更多的启动代码,它是一个空程序,没有全局或构造函数要运行。不知道是否有全局构造函数可调用。在任何情况下,它都必须准备好挂钩。你不使用它们的事实并不会让它们消失。???我们说的是同一件事:main.c/main.cpp翻译成同样的内容。可执行文件是不同的,因为它们链接不同的库。它们只链接不同的库,因为链接器是用
-lstdc++
调用的,而不是因为它是必需的,或者正如您所说的“C++要准备调用main要做的事情比C实际上要做的事情多得多”。哼哼。。。不正确:关键是如果你不链接C++库,你就可以正确地删除任何静态对象。这是C++ C++的前提,C.的C++程序有一个主要的可以做的事情。C程序不是。当然,在这个特殊的情况下,“阉割C++”就像C一样工作,但是任何C++程序都不能正常运行。C++也是它的库(是同一语言规范)。如果没有它,就做一些不再是C++的东西。我想你是指“函数”而不是“方法”,它有一个问题,就是不与标准库连接——它是语言的一部分,不是吗?我对破解一些奇怪的编译配置文件不感兴趣。我只是希望说,如果我不使用异常,那么我就不希望在我的二进制文件中有任何存根代码。在典型的实现中,该语言的一些功能是由编译器提供的,一些是由必须链接到的附加库提供的。如果不需要后面的功能,请不要链接到库。这些特性是语言的一部分是无关紧要的,如果您不使用它们,那么就不需要链接到提供它们的库。