忽略我为什么要这样做,只是想了解这里发生的事情: 此代码编译:
#include <stdio.h>
typedef char byte;
int main (void)
{
byte var_byte;
int byte = 10;
printf("\n Test program: %d\n", byte);
}
但是,如果我改变声明变量的顺序,它就不会编译。
这不编译:
#include <stdio.h>
typedef char byte;
int main (void)
{
int byte = 10;
byte var_byte;
printf("\n Test program: %d\n", byte);
}
编译错误:
b.c:7:8: error: expected ‘;’ before ‘var_byte’
byte var_byte;
^~~~~~~~
有人可以解释为什么订单很重要吗?
答案 0 :(得分:7)
在这个程序中
#include <stdio.h>
typedef char byte;
int main (void)
{
int byte = 10;
byte var_byte;
printf("\n Test program: %d\n", byte);
}
变量byte
的名称隐藏了typedef的名称。
根据C标准(6.2.1标识符范围)
- ...如果标识符指定同一名称空间中的两个不同实体,则范围可能会重叠。如果是这样,一个实体的范围 (内部范围)将严格地在另一方的范围之前结束 实体(外部范围)。 在内部范围内,标识符 指定在内部范围内声明的实体;宣布的实体 在外部范围内隐藏(并且不可见)在内部 范围。强>
醇>
注意标识符的名称和typedef名称属于同一名称空间。
typedef名称在全局范围(文件范围)中声明,而变量名称在内部块范围内声明,变量名称隐藏在全局范围内声明的名称。
考虑这个程序。
#include <stdio.h>
typedef char byte;
void f( void );
int main (void)
{
int byte = 10;
printf("\n Test program: %d\n", byte);
f();
}
void f( void )
{
byte c = 'A';
printf( "%c\n", c );
}
在函数main
的块范围内(相对于文件范围的内部范围),typedef的名称由具有相同名称的变量的声明隐藏。
但是在函数f
的块作用域内,typedef中声明的名称是可见的,因为函数的块作用域中的其他声明都不会隐藏在typedef中声明的名称。
这是一个更有趣的程序,它涉及声明点(它是一个C ++术语)
#include <stdio.h>
size_t byte = 255;
int main(void)
{
typedef int byte[byte];
{
byte byte;
printf( "sizeof( byte ) = %zu\n", sizeof( byte ) );
}
return 0;
}
它的输出可能看起来像
sizeof( byte ) = 1020
在文件范围中,存在名为byte
size_t byte = 255;
在函数main
的外部块范围内引入了typedef名称byte
。
typedef int byte[byte];
声明声明后,它隐藏了先前声明的名称byte
。就是这种typedef
typedef int byte[byte];
方括号中的名称byte
对应全局名称byte
。
然后在内部块范围内声明了一个名为byte
的数组,它隐藏了typedef名称。
byte byte;
注意表达式
中的内容sizeof( byte )
使用了数组的名称而不是typedef名称。
答案 1 :(得分:1)
在此编辑:(对问题的误解)
当您在C中声明变量时,它不会查找typedef
结构以查看与变量命名相同的结构。在第一个代码上,
byte var_byte;
这行代码出现在变量int byte
的声明之前。计算机将查找单词byte的最新引用,因为它是结构名称。
在第二个变量int byte
没有返回错误,因为您仍然可以在C中创建具有相同结构类型名称的变量。但是在这样做之后,您无法为该结构创建新结构因为计算机会认为它是指变量名而不是结构类型,因为变量被声明为最近