我最近刚刚决定学习C。我注意到有多个编译器可以下载。如果我为一个编译器编写C代码,它应该适用于所有编译器,对吗?
简短回答:是
长答案:
是,但前提是(但不限于):
- 您的代码不使用其他编译器无法使用的编译器特定内容
- 代码所依赖的库是可用的,并在其他编译器上正确设置
- 您的代码不调用/依赖未定义或实现定义的行为
- 另一个编译器使用与当前编译器大致相同的C标准进行编译
我会根据自己的想法在列表中添加更多内容。
在C标准中,定义了两种类型的"编译器相关"问题:
-
实现定义的行为:行为可能因编译器而异,但编译器必须提供某种一致的行为,并且必须记录这种行为。
一个直接来自标准的例子是:;实现定义行为的一个示例是当有符号整数右移时高阶位的传播&";。换句话说,-1>gt;1编译器之间可能有所不同,但编译器必须保持一致。
-
未定义行为:当你遇到未定义行为时,任何事情——我的意思是任何事情都可能发生。
您还需要注意违反约束的情况。通常,该标准规定了诸如";[main]应定义为返回类型为int[…]";(§5.1.2.2.1/1)。这相当于;如果main是用int以外的返回类型声明的,则程序的行为是未定义的"(参见§4.2,其中标准明确认可该解释)
请注意,一些实现定义的行为有限制-例如,sizeof(int)的值是实现定义的,但您知道sizeof(int>=sizeof(short)&;sizeof(int)<=sizeof(long)-因此,仅仅有任何实现定义的行为并不意味着你不能说任何关于程序的功能。