Len*_*mel 15 c c++ compiler-construction portability gcc
我对可移植性的不同方面感兴趣(正如你在浏览我的其他问题时所看到的那样),所以我读了很多关于它的内容.很多时候,我读/听说Code应该以一种可以在不同的编译器上编译的方式编写.
没有任何gcc/g ++的真实生活经验,在我看来它支持人们可以想象的每个主要平台,因此编译g ++的代码几乎可以在任何系统上运行.那么为什么有人会费心在MS编译器,英特尔编译器和其他人上运行他的代码呢?
我也可以想到一些原因.正如常见问题解答建议的那样,我会尝试将它们作为答案发布,反对将它们纳入我自己的问题中.
你们让我完全相信有几个很好的理由来支持多个编译器.原因很多,很难选择一个被接受的答案.对我来说最重要的原因:
另一方面,我仍然认为还有其他更重要的事情,现在我知道有时它根本不重要.
最后,没有一个单一的答案可以说服我不要选择GCC作为我项目的主要或默认编译器.
Nem*_*vic 20
我头脑中的一些原因:
1)避免被单个编译器供应商锁定(开源与否).
2)使用不同编译器编译代码可能会发现更多错误:警告不同,不同的编译器在不同程度上支持标准.
Bri*_*ell 13
在MSVC上进行编译是很好的,因为有些人可能拥有他们想要将代码链接到MSVC中的项目,而无需建立完全不同的构建系统.
在英特尔编译器下进行编译是很好的,因为它经常编译更快的代码.
在Clang下进行编译是很好的,因为它可以提供更好的错误信息并提供更好的开发体验,并且它比GCC更容易工作,因此将来可能会获得额外的好处.
通常,最好保持选项打开,因为没有一个编译器可以满足所有需求.GCC是一个很好的编译器,对于大多数用途来说都很棒,但有时你还需要其他东西.
即使你通常只是在GCC下编译,确保你的代码在其他编译器下编译也可能有助于找到可能阻止你的代码使用过去和未来版本的GCC的问题,例如,如果有的话GCC现在不那么严格,但后来添加了检查,另一个编译器可能会提前检查,帮助您保持代码清洁.在相反的情况下我发现这有用,其中GCC捕获的警告比MSVC更多的潜在问题(MSVC是我们需要支持的唯一编译器,因为我们只在Windows上发布,但我们做了部分端口到Mac在我们的空闲时间GCC下,这使我能够生成比其他方式更清晰的代码.
kem*_*002 12
可移植性.如果您希望可以通过尽可能多的人访问您的代码,则必须使其适用于最广泛的编译器.它与使网站在IE以外的浏览器上运行的想法相同.
其中一些是政治性的.公司有标准,人们有喜欢的工具等.告诉别人他们应该使用X,真的让一些人失望,并使其他人真的无法接触.
Nemanja也提出了一个很好的观点,针对某个编译器锁定您使用它.在开源世界中,这可能不是一个大问题(尽管人们可能会停止开发它并且它已经过时了),但是如果你购买它的公司停止产品或停业呢?
对于大多数语言,我更少关注可移植性,而更多地关注符合国际标准或接受的语言定义,从而可能遵循属性可移植性.然而,对于C来说,可移植性是一个有用的想法,因为编写一个"严格符合"标准的程序非常困难.(为什么?因为标准委员会觉得有必要为一些现有的做法做些事,包括给编译器一些你可能不喜欢的自由.)
那么为什么尝试符合标准或使您的代码可以被多个编译器接受,而不是简单地编写gcc(或您喜欢的其他编译器)接受的任何内容?
可能在2015年,gcc将接受一种与现在截然不同的语言.您不希望重写旧代码.
也许您的代码可能被移植到非常小的设备上,其中GNU工具链不受支持.
如果您的代码直接与任何ANSI C编译器一起编译,没有错误且没有警告,那么您的用户的生活将会更加轻松,并且您的软件可能会被广泛移植和使用.
也许有人会发明一个伟大的新工具来分析C程序,重构C程序,提高C程序的性能,或者发现C程序中的错误.我们不确定该工具将使用哪个版本的C或它可能基于什么编译器,但几乎可以肯定该工具将接受标准C.
在所有这些论点中,这是我发现最有说服力的工具论点.人们忘记了除了编译和运行源代码之外,还可以使用源代码做其他事情.在另一种语言,哈斯克尔,用于分析和重构工具远远落后编译器,但谁坚持与哈斯克尔98标准的人有一个访问很多更多的工具.类似的情况很可能是C:如果我要去构建一个工具的努力,我将基于一个生命周期为10年左右的标准,而不是一个可能在之前改变的gcc版本我的工具完成了.
也就是说,很多人可以完全忽视可移植性.例如,在1995年,我努力说服Linus Torvalds使用任何ANSI C编译器编译Linux成为可能,而不仅仅是gcc.Linus没有任何兴趣 - 我怀疑他得出的结论是他或他的项目中没有任何内容.而他是对的.让Linux编译只使用gcc对于编译器研究人员来说是一个很大的损失,但Linux没有损失."工具论证"并不适用于Linux,因为Linux变得如此受欢迎; 为C程序构建分析和错误查找工具的人愿意使用gcc,因为在Linux上运行会使他们的工作产生重大影响.因此,如果您可以指望您的项目成为像Linux或Mosaic/Netscape一样的疯狂成功,您可以忽略标准:-)
如果您要为不同的平台构建,最终将使用不同的编译器.此外,C++编译器往往略微落后于C++标准,这意味着它们通常会随着时间的推移而改变对它的依从性.如果将目标分配给所有主要编译器,那么代码维护成本将会降低.