检查一下:
这在iPhone上编译得很好:
typedef int ATYPE;
void AFunc()
{
ATYPE ATYPE;
ATYPE = 1337;
}
这在iPhone上编译得很好:
typedef int ATYPE;
typedef ATYPE _ATYPE;
struct AStruct
{
_ATYPE ATYPE;
};
void AFunc()
{
AStruct bob;
bob.ATYPE = 1337;
}
但这不是:
typedef int ATYPE;
struct AStruct
{
ATYPE ATYPE;
};
void AFunc()
{
AStruct bob;
bob.ATYPE = 1337;
}
以上编译在其他平台上编译得很好。
我想我们可以通过第二个例子来解决它,但是有人知道为什么会这样吗?
答案 0 :(得分:1)
好吧,如果你不喜欢我以前的答案,这里是另一个答案。 http://www.comeaucomputing.com/tryitout/上的在线Comeau C ++编译器编译了您的第三个示例,没有错误。鉴于这通常被认为是C ++编译器中的黄金标准,这表明这可能是iPhone SDK中G ++编译器中的一个错误(当然,在我的评论中引用的其他G ++版本中)。< / p>
如果这是真的 - 我手头没有C ++规范来争论细节 - 你的“为什么?”的答案。问题是,“因为G ++有一个奇怪的角落案例错误。请在GCC错误跟踪器中提出一个问题,以便有人解决它。”
答案 1 :(得分:0)
这是因为iPhone编译器无法正确识别第一种情况下的代码是无效的C ++,但出于某种原因,在第三种情况下它确实能够正确识别错误。
您可以看到为类型和变量赋予相同的名称是无效的,因为允许它会导致混淆:
typedef short atype;
long long atype;
printf("%d", sizeof(atype)); // What does this print?
编译器在给定无效代码时无法发出错误,而是将其编译为正确,这是相当常见的。它刚刚发生。