我对以下代码感到惊讶,
#include<stdio.h>
typedef int type;
int main( )
{
type type = 10;
printf( "%d", type );
}
这个程序已经完成,程序输出为10。
但是当我稍微改变代码时,
#include<stdio.h>
typedef int type;
int main()
{
type type = 10;
float f = 10.9898;
int x;
x = (type) f;
printf( "%d, %d", type, x);
}
在aCC编译器中:
“'type'用作类型,但尚未定义为类型。”
在g ++编译器中:
“错误:预期`;'在f“
之前
编译器是否在第二种情况下无法识别模式,因为此模式可能与变量的赋值,表达式的求值等有关,并且在第一种情况下,因为此模式仅在定义变量时使用编译器认出了它。
答案 0 :(得分:11)
typedef
标识符(如变量名称)也具有范围。之后
type type = 10;
变量type
会影响类型名称type
。例如,这段代码
typedef int type;
int main( )
{
type type = 10;
type n; //compile error, type is not a type name
}
由于同样的原因,无法编译,在C ++中,您可以使用::type
来引用类型名称:
typedef int type;
int main( )
{
type type = 10;
::type n; //compile fine
}