移植代码问题的IPhone编译:与typedef'd类型同名的变量失败

时间:2010-03-03 23:55:51

标签: c++ iphone compiler-construction

检查一下:

这在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;
}

以上编译在其他平台上编译得很好。

我想我们可以通过第二个例子来解决它,但是有人知道为什么会这样吗?

2 个答案:

答案 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?

编译器在给定无效代码时无法发出错误,而是将其编译为正确,这是相当常见的。它刚刚发生。