看看这个:
这在 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;
}
上面的代码在其他平台上编译得很好。
我想我们可以通过第二个例子来解决这个问题,但是有人知道这是为什么吗?
好吧,如果您不喜欢我之前的答案,这里是替代答案。 http://www.comeaucomputing.com/tryitout/ 上的在线 Comeau C++ 编译器可以毫无错误地编译您的第三个示例。 鉴于这通常被认为是 C++ 编译器中的黄金标准,这表明这很可能是 iPhone SDK 中的 G++ 编译器中的错误(当然,还有我在评论中引用的其他版本的 G++ 中)。
如果这是真的——而且我手头没有 C++ 规范来争论细节——那么你的“为什么?”的答案问题是,“因为 G++ 有一个奇怪的极端错误。请在 GCC 错误跟踪器中就此问题提交一个问题,以便有人修复它。”
这是因为 iPhone 编译器无法正确识别第一种情况下的代码是无效的 C++,但由于某种原因,在第三种情况下它确实正确识别了错误。
您可以看到,给类型和变量赋予相同的名称是无效的,因为允许它会导致混乱:
typedef short atype;
long long atype;
printf("%d", sizeof(atype)); // What does this print?
编译器在给出无效代码时无法发出错误,而是将其编译为正确的代码,这是相当常见的。 它就这样发生了。