2014-09-29 115 views
2

我刚刚决定学习C.我注意到我可以下载多个编译器。如果我为一个编译器编写C代码,它应该适用于所有编译器,对吗?使用多个编译器编译C代码

+0

用尽可能多的不同编译器编译代码是合理可行的(N> 1比N == 1好得多)。关于代码的问题你会得到不同的看法。确保您也将编译器的警告级别设置为较高级别,然后注意他们的说法。例如,如果其中一个编译器是GCC,则可以使用'-Wall -Wextra -Werror'来发现大多数问题。您还需要指定一个标准,例如'-std = c11',并且可能会添加'-pedantic'以避免意外使用编译器扩展。我使用比GCC更多的选项。 – 2014-09-29 04:20:35

+0

保持多个编译器与许多为每个库建立的库(你自己和第三方)保持最新状态可能是一件非常痛苦的事情。值得一看像'cmake'这样的工具,它可以通过多个编译器来构建。这不是什么魔术般的解决方案,但它可以提供帮助。几年前,我曾经在MinGW GCC和VC++之间来回切换。即使只使用GCC,我仍然使用cmake。 – Steve314 2014-09-29 05:34:01

回答

6

简短的回答:是的

龙答:

是的,但前提是(但不限于):

  • 你的代码不使用编译器的具体的东西,这不是可以用另一个编译器
  • 您的代码依赖的库可用并在另一个编译器上正确设置
  • 您的代码不会调用/依赖在未定义或实现定义的行为上
  • 其他编译器大致使用当前编译器的C标准进行编译。

我会在列表中添加更多,因为我认为他们。

+0

通过未定义的行为,你的意思是一个编译器可以比另一个编译器更好地处理未定义的行为?一个编译器中的意义错误,但不是另一个,是正确的? – DivideByZero 2014-09-29 03:54:59

+3

@ user3155415未定义的行为正是它所说的:undefined。这意味着两个不同的编译器可以完成两个完全不同的事情。两者都不比其他更好。未定义的行为总是逻辑上的错误。 – 2014-09-29 03:55:52

+0

实现定义的行为不一定是个大问题。例如,'LONG_MAX'的值是实现定义的,所以如果你的代码根据'LONG_MAX'的值改变了它的行为,它就会显示实现定义的行为。但这可能不是问题。未定义的行为是有问题的行为,并且['恶魔'](http://www.catb.org/jargon/html/N/nasal-demons.html) - 如'未定义的行为可能会带来恶魔飞出你的鼻子“ - 应该令人难忘(如果不合情理)。 – 2014-09-29 05:28:03

2

在C标准中,定义了两种类型的'compiler-dependent'问题:

  • 实现定义的行为:行为可能会从编译器有所不同的编译器,但是编译器必须提供某种形式的一致行为并且必须记录这种行为。

    一个直接来自标准的例子:“一个实现定义的行为的例子是当一个有符号整数右移时高位传播。”换句话说,编译器之间的-1 >> 1的结果可能会有所不同,但编译器必须保持一致。

  • 未定义的行为:当您遇到未定义的行为时,任何事情 - 我的意思是任何事情都可能发生。

您还需要注意违反约束条件。标准通常指定诸如“[main]应该用int [...]的返回类型”(§5.1.2.2.1/ 1)来定义。这相当于“如果使用int以外的返回类型声明main,则程序的行为是未定义的。” (请参阅§4.2,其中标准明确支持该解释)

请注意,某些实现定义的行为有限制 - 例如sizeof(int)的值是实现定义的,但您知道sizeof(int)> = sizeof(short)& & sizeof(int)< = sizeof(long) - 所以只是有任何实现定义的行为并不意味着你不能说什么程序的作用。