typedef 和变量名

2023-11-25

忽略为什么我想这样做,只是想了解这里发生的事情: 此代码编译:

#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;
        ^~~~~~~~

有人可以解释一下为什么顺序很重要吗?


在这个节目中

#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 标识符的范围)

  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 的名称被同名变量的声明隐藏。

但是在函数的块作用域内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;
}

它的输出可能看起来像

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 名称。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

typedef 和变量名 的相关文章

随机推荐

  • 使用向量元素调用函数的通用模板

    我想用来自向量的参数调用一个函数 仅此一项当然非常简单 但我想编写一个通用包装器来为我完成任务 稍后它还应该从像 boost variant 这样的泛型类型进行转换 但我想在这个问题解决后我可以处理这个问题 这是我的第一次尝试 includ
  • 在同一个应用程序中使用谷歌地图和百度地图

    我想知道是否有人在同一版本中实现了谷歌地图V2和百度地图 因为通用汽车在中国没有按预期运作 或者我应该将项目分成两个分支 然而 最好跳过维护两个分支 我的解决方案是照常实现 GM 但是如果用户设置了中国 通过设置 静态地图 则使用静态地图
  • SKScene iPad 高度宽度反转

    我正在尝试在仅支持横向模式的 iPad 应用程序中用图块填充我的 SKScene 在场景中我检测到 h w 如下 int h UIScreen mainScreen bounds size height int w UIScreen mai
  • 如何为Asp.Net中的所有子文件夹注册HttpHandler?

    我想注册一个 HttpHandler 以包含根文件夹的所有子文件夹 无论它们嵌套的深度如何 我本希望下面的代码的行为能够做到这一点 但实际上它只包含直接位于根文件夹中的项目
  • 第 25 行出现错误 1030 (HY000):来自存储引擎的错误 168

    我正在尝试将 sql 导入到我的数据库中 我正在使用 Ubuntu 操作系统 这是一个错误 david david VirtualBox mysql u root p test project lt db sql Enter passwor
  • 如何验证 string.Format 方法的格式

    string Format 具有以下方法签名 string Format format params 我想每次都传递自定义格式 string custFormat Hi 0 n I only care about numbers here
  • 如何使用 Require.js 实现 TinyMCE?

    我目前正在将 TinyMCE 源作为依赖项传递 然后调用 tinyMCE init 但它没有初始化 TinyMCE 当我console log TinyMCE时 它返回一个TinyMCE对象 代码示例如下 define jQuery Und
  • 我有一个国家代码列表和一个语言代码列表。如何从国家/地区代码映射到语言代码?

    当用户访问该网站时 我可以获得他们的国家 地区代码 我想用它来设置默认语言 如果需要 他们可以稍后修改 只是根据他们所在的国家 地区对他们可能会说的语言进行一般猜测 是否存在从国家 地区代码到语言代码的明确映射 我找不到 我知道并非特定国家
  • 如何在MySQL数据库中存储.text文件?

    我可以将数据文件 例如txt文件 存储到MySql服务器吗 如果可以的话 如何保存它们 您可以使用LOAD DATA INFILE读取文件的内容并将其以结构化格式存储在数据库的表中 这比在客户端上读取和解析文件然后使用多个 INSERT 语
  • 如何使用选择器设置文本大小?

    我使用选择器 但不知道如何设置文本大小 也许我做错了什么 帮助 箭头 xml
  • Doxygen 在记录 PHP 时出现奇怪的问题 if

    当我尝试记录我的项目时 我遇到了一个奇怪的问题 我有以下代码 Set default action for called controller If no action is called default index will be set
  • REST JAX-RS javax.ws.rs.ProcessingException:

    每当我的 REST 客户端代码使用以下代码调用 REST 服务时 我都会遇到以下异常 Code public void putWatcher Watcher watcher System out println In REST Client
  • JRE系统库缺少tools.jar

    我正在使用 Ubuntu 12 04 LTS 在我的 Eclipse 项目中 我需要使用 com sun tools attach 包 但是 我的 JRE 系统库不包括包含该包的tools jar 文件 我尝试为 Java 6 和 7 安装
  • 如何将 IEnumerable 转换为 ObservableCollection?

    如何转换IEnumerable to ObservableCollection 根据MSDN var myObservableCollection new ObservableCollection
  • 使用 iText 7 获取 PDF 文件的创建日期

    我必须创建一个工具 将其创建日期添加到几个 pdf 文件名中 我想使用内部存储在 pdf 中的创建日期 为此我下载了 iText Community Edition 现在 我的代码是这样开始的 VB Module Module1 Sub M
  • Android 操作系统和 postgreSQL

    我们正在进行一个 Android 项目 但需要连接到我们在其他项目中使用的 postgreSQL 服务器 关于这个起点有什么建议吗 有什么东西 有偿或无偿 可以让我们实现这一目标吗 我意识到这是一个非常普遍的问题 尽管我们在编写桌面客户端
  • Primefaces 依赖 selectOneMenu 和 required="true"

    在我的应用程序中 我有三个下拉菜单 p selectOneMenu 说A B C 其中两个是相关的 说B和C 通过更改B的值 我动态地将值加载到C 还有一个文本框 当 on change 事件从这三个下拉列表中触发时 文本框的值由 ajax
  • 让 Xcode 忽略第 3 方项目中的 LLVM 构建警告

    我的 Xcode 工作区中有一个第三方项目 它是我的主项目的依赖项 并且我希望 Xcode 忽略来自该第三方项目的所有构建警告 最好我想忽略项目中 Vendor 组的所有构建警告 因为那是我放置所有第三方代码的地方 可能的 是的 这是可能的
  • mysqli 在 PHP 7.4 中支持 caching_sha2_password 吗?

    当我尝试从 PHP 7 3 升级到 PHP 7 4 时 收到以下错误 执行 caching sha2 auth 109 时出现意外的服务器响应 据我所知 这表明 PHP 7 4 MySQLi 正在尝试使用caching sha2 passw
  • typedef 和变量名

    忽略为什么我想这样做 只是想了解这里发生的事情 此代码编译 include