我写了一个简单的C程序,我原以为它会编译失败,但不幸的是它在C中编译并运行良好,但在C++中编译失败。
考虑下面的程序:
#include <stdio.h>
int main()
{
char *c=333;
int *i=333;
long *l=333;
float *f=333;
double *d=333;
printf("c = %u, c+1 = %u",c,c+1);
return 0;
}
访问此链接:http://ideone.com/vnKZnx http://ideone.com/vnKZnx
我认为由于C++的强类型检查,这个程序肯定无法在C++中编译。为什么这个程序用C编译?事实上,编译器也会显示警告。我正在使用 Orwell Dev C++ IDE(gcc 4.8.1 编译器)。我还在其他编译器(Borland Turbo C++ 4.5)上尝试了相同的程序,通过扩展名.c保存它,但在这个编译器上它无法编译。
这段代码既不是合法的 C,也不是合法的 C++。
N1570 §6.7.9/p11:
标量的初始值设定项应为单个表达式,可选
括在大括号中。对象的初始值是
表达式(转换后);相同的类型约束和
与简单赋值一样的转换适用,采用的类型
标量是其声明类型的非限定版本。
§6.5.16.1/p1 规定了简单分配:
应满足下列条件之一:
- 左操作数具有原子、限定或非限定算术类型,右操作数具有算术类型;
- 左操作数具有与右操作数兼容的结构或联合类型的原子、限定或非限定版本;
- 左操作数具有原子、限定或非限定指针类型,并且(考虑左操作数在左值之后将具有的类型)
转换)两个操作数都是指向限定或非限定的指针
兼容类型的版本,并且左边指向的类型有
右侧指向的类型的所有限定符;
- 左操作数具有原子、限定或非限定指针类型,并且(考虑左操作数在左值之后将具有的类型)
转换)一个操作数是指向对象类型的指针,另一个操作数是
是一个指向合格或不合格版本的指针
void
,以及
左边指向的类型具有所指向类型的所有限定符
从右边;
- 左操作数是原子的、限定的或非限定的指针,右操作数是空指针常量;或者
- 左操作数的类型为原子、限定或非限定
_Bool
,右边是一个指针。
没有一个与左边的指针匹配333
在右侧。 §6.5.16.1/p1 是约束,并且需要一致的实现才能在违反约束时生成诊断(§5.1.1.3/p1):
合格的实施应产生至少一个诊断
消息(以实现定义的方式标识)如果
预处理翻译单元或翻译单元包含
违反任何语法规则或约束,即使行为是
也明确指定为未定义或实现定义。
碰巧 GCC 决定在 C 模式下产生警告而不是错误并继续编译它,但它不是必须的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)