typedef和变量名

Sim*_*der 5 c variables scope typedef

忽略我为什么要这样做,只是试图理解这里发生了什么:这段代码编译:

#include <stdio.h>
typedef char byte;

int main (void) 
{
    byte var_byte;
    int byte = 10;

    printf("\n Test program: %d\n", byte);
}  
Run Code Online (Sandbox Code Playgroud)

但是,如果我改变声明变量的顺序,它就不会编译.

这不编译:

#include <stdio.h>
typedef char byte;

int main (void)
{
    int byte = 10;
    byte var_byte;

    printf("\n Test program: %d\n", byte);
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

b.c:7:8: error: expected ‘;’ before ‘var_byte’
   byte var_byte;
        ^~~~~~~~
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么订单很重要吗?

Vla*_*cow 7

在这个计划中

#include <stdio.h>
typedef char byte;

int main (void)
{
    int byte = 10;
    byte var_byte;

    printf("\n Test program: %d\n", byte);
}
Run Code Online (Sandbox Code Playgroud)

变量byte的名称隐藏了typedef的名称.

来自C标准(6.2.1标识符范围)

  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 );
}
Run Code Online (Sandbox Code Playgroud)

在函数的块范围内main(相对于文件范围的内部范围),typedef的名称由具有相同名称的变量的声明隐藏.

但是在函数的块作用域内,ftypedef中声明的名称是可见的,因为函数的块作用域中的其他声明都不会隐藏在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;
}
Run Code Online (Sandbox Code Playgroud)

它的输出可能看起来像

sizeof( byte ) = 1020
Run Code Online (Sandbox Code Playgroud)

这里是在文件范围内有声明变量的名称 byte

size_t byte = 255;
Run Code Online (Sandbox Code Playgroud)

在函数的外部块范围中main引入了typedef名称byte.

typedef int byte[byte];
Run Code Online (Sandbox Code Playgroud)

byte在声明声明符后隐藏了先前声明的名称.就是这种类型的

    typedef int byte[byte];
Run Code Online (Sandbox Code Playgroud)

该名byte在方括号对应于全局名称byte.

然后在内部块作用域中声明了一个具有相同名称的数组,该数组 byte隐藏了typedef名称.

byte byte;
Run Code Online (Sandbox Code Playgroud)

注意表达中的那个

sizeof( byte )
Run Code Online (Sandbox Code Playgroud)

使用数组的名称而不是typedef名称.


小智 1

在这里编辑:(对问题的误解)

当您在 C 中声明变量时,它不会查找typedef结构来查看是否有与该变量同名的结构。在第一个代码中,

byte var_byte; 
Run Code Online (Sandbox Code Playgroud)

这行代码位于变量声明之前int byte。计算机将查找单词 byte 的最新引用,因为它是此处的结构名称。

在第二个变量中,变量int byte不会返回错误,因为您仍然可以在 C 中创建具有相同结构类型名称的变量。但是这样做后,您无法为该结构创建新的结构,因为计算机会认为它是引用变量名称而不是最近声明变量的结构类型