为什么可以声明同名的结构体和非结构体?

2023-11-26

显然,

出于 C 史前时期的原因,可以在同一作用域中声明具有相同名称的结构体和非结构体。 -(Bjarne Stroustrup - C++ 编程语言。第四版)

例如:

struct Ambig {};

// the struct must be referred to with the prefix struct
void Ambig(struct Ambig* buf) {}

我只是好奇最初的原因是什么?如果不理解,这似乎是一个糟糕的语言设计的例子,会导致歧义和混乱。


正如您在 Stroustrup 的引述中所述,原因是 历史的。在C语言中,你must始终在名称前面加上前缀 结构与struct;结构的名称(例如 联合体或枚举)被称为标签,并且存在于一个完全的 与其他符号不同的名称空间。所以像这样的事情:

struct stat
{
    //  ...
};
int stat( char const* filename, struct stat* buf );

是完全合法的。 (实际上,上面是 Posix 的一部分)。

在 C++ 中,类的名称(用class, struct or union) 或枚举与其他所有内容位于同一名称空间中, 与 C 不同的是,你可以这样写:

struct MyClass {};
MyClass variableName;

这不是合法的 C。在 C 中,第二行必须是:

struct MyClass variableName;

问题是 C++ 需要能够使用接口 在 C 中定义(如上面的 Posix 接口)。所以C++定义了 一些特殊的规则允许它:你可以给一个变量或 函数和类具有相同的名称。当您这样做时, 变量或函数名称优先,并隐藏类 名称,除了“详细类型说明符”(即class, struct, union or enum,后跟一个符号),其中 查找时将忽略非类型名称。

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

为什么可以声明同名的结构体和非结构体? 的相关文章

随机推荐

  • Javascript:带有正则表达式的indexOf

    如何检查页面url是否包含 字符加上一些随机数字 例如www google de 1234 if window location href indexOf gt 0 alert true indexOf 支持正则表达式吗 Use Strin
  • Tomcat通过log4j访问日志记录?

    我有一个干净的tomcat7安装 启用了log4j 根据http tomcat apache org tomcat 7 0 doc logging html Using Log4j 应用程序级 日志记录确实使用 log4j 配置 我将日志定
  • 如何在 C 语言中获取文件的大小? [复制]

    这个问题在这里已经有答案了 如何找出用 C 编写的应用程序打开的文件的大小 我想知道大小 因为我想将加载的文件的内容放入一个字符串中 我使用它分配malloc 只是写malloc 10000 sizeof char 恕我直言 这是一个坏主意
  • 如何从 Internet Explorer 无缝重定向到 Microsoft Edge?

    我正在尝试在我的网站上弃用 Internet Explorer 并且当有人尝试在 Internet Explorer 上访问该网站时 我想复制 Twitter 的行为 从我到目前为止对他们的流程的拼凑来看 似乎有一个基于用户代理字符串的服务
  • 未考虑 if-else 表达式后的缩进变化?

    鉴于此 该运算符用于评估管道中的副作用 let inline gt a f f a a 和这段代码片段 if 1 1 then same else different gt printfn The numbers are s gt prin
  • JavaScript:instanceof 运算符

    第一个代码 function MyConstructor var myobject new MyConstructor MyConstructor prototype myobject instanceof MyConstructor fa
  • Android 检查互联网连接[重复]

    这个问题在这里已经有答案了 我想创建一个使用互联网的应用程序 并且我正在尝试创建一个函数来检查连接是否可用 如果不可用 则转到具有重试按钮和说明的活动 附件是我到目前为止的代码 但我收到了错误Syntax error insert to c
  • 如何在 sqlalchemy 会话查询中进行连接?

    我需要在 sqlalchemy 中找到与此查询等效的内容 SELECT u user id u user name c country FROM table user u table country c WHERE u user email
  • Android,如何以编程方式播放WAV文件

    我的目录中已有一个 wav 文件 同时我需要将它与mp3文件一起播放 我用了 String recordedFile storage sdcard0 PINOYKARAOKE 1373597371359 wav MediaPlayer re
  • 警告:以“root”用户身份运行 pip

    我正在 Docker 中制作我的 python Django 应用程序的简单图像 但在构建容器结束时 它会抛出下一个警告 我在 Ubuntu 20 04 上构建它 WARNING Running pip as the root user c
  • 如何唯一标识 USB 设备?

    我想知道如何获取 USB 存储设备的唯一 ID 我已经知道如何从这篇文章中获取 SCSI 序列 id linux下C U盘序列号该帖子提到使用设备描述符来获取 ID 有人可以发布一些代码来确定 Linux 下的设备描述符信息吗 ls l d
  • afnetworking 3.0 迁移:如何使用标头和 HTTP 正文进行 POST

    我正在尝试向 youtube API 发出一个包含 HTTPHeader 字段和 HTTP 正文的 POST 请求 以前在 AFNetworking 2 0 版本中 我曾经这样做过 效果很好 NSDictionary parameters
  • 如何让 Visual Studio 显示任何方法可能抛出的异常?

    我想知道如何让视觉工作室显示以下例外情况any方法可能会抛出异常 而不仅仅是 NET Framework 方法 我使用的是 C 例如 下面的图片显示 当我将鼠标悬停在 Console WriteLine 上时 它会显示 Exceptions
  • 我应该避免在 Node js 上的每个 async/await 中使用 try catch 吗?

    这是我在单元测试时遇到的一个设计问题 让我们深入研究这个例子 想象一下 async function foo try return apiCall catch e throw new CustomError e async function
  • 如何为 django-simple-captcha 创建 Ajax 刷新

    我正在为基于 django 的网站使用 django simple captcha 应用程序 我能够将验证码表单字段集成到我的表单中 但问题是 如何创建一个调用 Ajax 刷新来刷新验证码图像的按钮点击时 该应用程序的文档不是很清楚 我尝试
  • 有没有关于 PyQt 库在 Mac OS Big Sur 中不起作用的解决方案?

    我已经使用 PyQt 库完成了一些项目作为我的课堂作业 在提交之前我需要检查我的申请是否有效 今天 3 小时前 我将我的 Mac book 操作系统更新为 Big Sur 我发现 PyQt 库不起作用 它不显示任何 GUI 有人知道如何修复
  • 在提交到存储库之前解压缩压缩数据文件

    以某种方式在存储库中存储正常压缩文件的 未压缩 版本是否有意义 如果是这样 是否有标准方法来实现这一点 也许是一个标准的预提交挂钩 它将每个此类文件解压缩到一个专门命名的文件夹中 以及一个将这些特殊命名的文件夹压缩为 LibreOffice
  • “eq()”和“==”有什么区别?

    std 是这样说的 pub trait PartialEq
  • gii 无法在 yii 中工作

    我是 yii 框架的新手 在我的网站 gii 显示错误 错误403 您无权访问该页面 我在配置文件中设置gii像这样 gii gt array class gt system gii GiiModule password gt test12
  • 为什么可以声明同名的结构体和非结构体?

    显然 出于 C 史前时期的原因 可以在同一作用域中声明具有相同名称的结构体和非结构体 Bjarne Stroustrup C 编程语言 第四版 例如 struct Ambig the struct must be referred to w