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

问题描述 投票:0回答:2

看看这个:

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

上面的代码在其他平台上编译得很好。

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

c++ iphone
2个回答
1
投票

好吧,如果您不喜欢我之前的答案,这里是替代答案。 http://www.comeaucomputing.com/tryitout/ 上的在线 Comeau C++ 编译器可以毫无错误地编译您的第三个示例。 鉴于这通常被认为是 C++ 编译器中的黄金标准,这表明这很可能是 iPhone SDK 中的 G++ 编译器中的错误(当然,还有我在评论中引用的其他版本的 G++ 中)。

如果这是真的——而且我手头没有 C++ 规范来争论细节——那么你的“为什么?”的答案问题是,“因为 G++ 有一个奇怪的极端错误。请在 GCC 错误跟踪器中就此问题提交一个问题,以便有人修复它。”


0
投票

这是因为 iPhone 编译器无法正确识别第一种情况下的代码是无效的 C++,但由于某种原因,在第三种情况下它确实正确识别了错误。

您可以看到,给类型和变量赋予相同的名称是无效的,因为允许它会导致混乱:

typedef short atype;
long long atype;
printf("%d", sizeof(atype));  // What does this print?

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

© www.soinside.com 2019 - 2024. All rights reserved.