在这个节目中
#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 名称。