我对下面的代码感到惊讶,
#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" 之前
在第二种情况下,编译器是否无法识别该模式,因为该模式可能与变量的赋值、表达式的求值等相关,而在第一种情况下,因为该模式仅在定义编译器识别的变量时使用它。
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
}