如何阅读 C 声明?

2023-12-21

我听说过一些方法,但没有一个能坚持下来。就我个人而言,我尝试避免 C 中的复杂类型,并尝试将它们分解为组件 typedef。

我现在面临着维护一些来自所谓的“三星级程序员”的遗留代码,并且我很难阅读一些***代码[][]。

如何阅读复杂的 C 声明?


本文解释了相对简单的 7 条规则,如果您发现自己想要或需要手动执行此操作,则可以使用这些规则来阅读任何 C 声明:http://www.ericgiguere.com/articles/reading-c-declarations.html http://www.ericgiguere.com/articles/reading-c-declarations.html

  1. 找到标识符。这是你的起点。在一张纸上写下“将标识符声明为”。
  2. 向右看。如果那里什么都没有,或者有一个右括号“)”,则转至步骤4。
  3. 您现在位于数组(左括号)或函数(左括号)描述符上。可能有一个序列,以不匹配的右括号或声明符结尾(分号或用于初始化的“=”)结束。对于每个这样的描述符,从左到右阅读:

    • 如果是空数组“[]”,则写“array of”
    • 如果数组有大小,请写“数组大小”
    • 如果是函数“()”,则写“函数返回”

    在不匹配的括号或声明符末尾处停止,以先到者为准。

  4. 返回起始位置并向左看。如果那里什么都没有,或者有左括号“(”,则转到步骤6。
  5. 您现在位于指针描述符“*”上。左边可能有一个序列,以不匹配的左括号“(”或声明符的开头结尾。从右向左读取,对于每个指针描述符写入“指向”。在不匹配的括号处停止或声明符的开始,以先到者为准。
  6. 此时,您有一个带括号的表达式或完整的声明符。如果您有带括号的表达式,请将其视为新的起点并返回到步骤 2。
  7. 写下类型说明符。停止。

如果您对某个工具感到满意,那么我同意使用该程序的建议cdecl: http://gd.tuwien.ac.at/linuxcommand.org/man_pages/cdecl1.html http://gd.tuwien.ac.at/linuxcommand.org/man_pages/cdecl1.html

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

如何阅读 C 声明? 的相关文章

  • WPF 中的屏幕分辨率问题?

    我将在 WPF 中使用以下代码检测分辨率 double height System Windows SystemParameters PrimaryScreenHeight double width System Windows Syste
  • Windows 10 Mobile (10.0.14393) 地理围栏后台任务 (LocationTrigger)

    自从10 0 14393 周年纪念更新 LocationTrigger似乎不起作用 我有 Windows Phone 8 1 应用程序 也适用于 UWP 应用程序 输出到的便携式库Windows Runtime Component图书馆 w
  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • 通过增加索引之和来生成排序组合的有效方法

    对于启发式算法 我需要一个接一个地评估特定集合的组合 直到达到停止标准 由于它们很多 目前我正在使用以下内存高效迭代器块生成它们 受到 python 的启发 itertools combinations http docs python o
  • clang 格式换行符在错误的位置

    给出以下代码行 get abc manager get platform status abc platform status sw update status fill update status actions allowed stat
  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • CultureInfo 的实例(来自相同的文化)根据操作系统而变化

    我有一个网站 上面写着这样的日期 CultureInfo cultureInfo CultureInfo GetCultures CultureTypes AllCultures FirstOrDefault c gt string Equ
  • 选择列表逻辑应位于 ASP.NET MVC、视图、模型或控制器中的什么位置?

    我觉得我的问题与这个问题很接近 但我想对这样的代码应该放在哪里进行更一般的讨论 Asp Net MVC SelectList 重构问题 https stackoverflow com questions 2149855 asp net mv
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • C# 中的常量和只读? [复制]

    这个问题在这里已经有答案了 可能的重复 const 和 readonly 之间有什么区别 https stackoverflow com questions 55984 what is the difference between cons
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构

随机推荐

  • 如何在perl中动态加载模块并执行方法

    我正在跟进此事question https stackoverflow com questions 6336270关于 Perl Web 服务 我已经设法从主程序加载和执行模块 每个模块都是这样的 usr bin perl package
  • 带复制和赋值的 C++ Qt 反射

    As the QObject文档 http qt project org doc qt 4 8 qobject html no copy constructor or assignment operator和许多其他人解释说 QObject
  • 依赖 Aether 的 Maven mojo 可以兼容 Maven 3.0.x 和 3.1.x 吗?

    Maven 3 1 0 版本 http maven apache org docs 3 1 0 release notes html依赖于 Eclipse Aether org eclipse aether 而不是 Sonatype Aet
  • 随着鼠标滚动移动视频背景

    你看过凯蒂 佩里的网站吗 太棒了 我是认真的 没有垃圾邮件 它有一个移动的背景视频 我不明白他们是如何实现的 这是主页 http www katypeerry com http www katyperry com 当您开始向下滚动时 背景图
  • 页面上所有脚本完全加载后运行js函数

    当我的页面完全加载时 我试图运行一个简单的 JavaScript 函数 例如这个函数 我的页面有一个从外部 URL 检索的长时间加载 秒 脚本 该脚本呈现 html 正文中的主要内容 我正在使用 Bootstrap 其中我的主体部分base
  • 如何使用 glide 下载存储在 firebase 中的图像的缩略图

    我想从我的 firebase 存储中下载图像缩略图而不是整个图像 我正在使用 glide 来加载图像 但我不知道如何加载图像缩略图 因为它会更快且内存效率更高 您首先需要为图像创建缩略图 可能使用类似谷歌云功能 https cloud go
  • 使用 PyPdf2 更改 pdf 书签的顺序

    我创建了一个应用程序 将多个 pdf 与书签合并 如果原始pdf已经有书签 我想保留它们并在pdf的开头添加一个书签 我使用以下代码 title和path代码中的内容来自用户输入 from PyPDF2 import PdfFileRead
  • Windows 过滤平台可从托管代码中过滤 HTTPS

    我想为Windows开发一个基于主机的防火墙 主要是过滤以HTTPS开头的URL 我知道 Microsoft 正在将 WFP 作为已弃用的旧技术的替代品 例如防火墙 过滤器挂钩 NDIS TDI WSA 和 Winsock 2 LSP 但
  • 尝试序列化 GPathResult 时,Groovy XmlUtil.serialze() 抛出“序言中不允许内容”错误

    我在 Groovy 的 1 7 3 XmlUtil serialize GPathResult 方法中遇到了一个奇怪的问题 当我使用 GPathResult 调用它时 它会抛出 序言中不允许内容 错误 但 groovy util Node
  • 为什么对 jQuery $.fn.data() 的更改不会更新相应的 html 5 data-* 属性?

    下面是一个简单的示例来说明该行为 给定这个 html 标记 div div 和这个 jQuery 代码 使用 jQuery 1 5 1 read the data alert div data company returns Microso
  • 使用护照持有者的自定义错误消息

    我正在使用护照来保护我的 API 我有点难以理解在出现错误时应该如何发回自定义消息 我希望在这里找到答案 这是我所做的 路由 server js router route Applications get authController Be
  • 处理多个 NSTableView 的最佳方法

    在不使用 Cocoa Bindings 的情况下处理多个 NSTableView 的最佳方法是什么 在我的应用程序中 我有两个 NSTableViews 它们之间的关系足够密切 因此我使用相同的对象作为两者的委托和数据源 问题是两个 tab
  • 求一个数的真正大幂

    I am creating a small game for students and in a place it has to display the value of 27830457 1 如果数字不是那么大 我可以调用 BigInte
  • ReactJS + Socket.IO - 处理套接字连接的最佳方式

    我正在尝试使用 Node 和 Socket IO 制作一个 ReactJS 实时应用程序 但我很难找出在客户端处理套接字连接的最佳方法 我有多个 React 组件 它们都需要来自服务器的一些信息 并且最好通过套接字连接实时获取 但导入时so
  • 具有多个条件的 VLOOKUP 在一个单元格中返回值

    我发现这个 VBA 能够使用一个匹配条件将所有匹配值返回到一个单元格中 Function MYVLOOKUP pValue As String pWorkRng As Range pIndex As Long Update 20150310
  • 输入文件 onchange 事件未在 Chrome 中触发

    这是我在 chrome 中注意到的一件奇怪的事情 如果用户选择一个文件 然后再次打开文件对话框再次选择同一文件 则 chrome 不会触发 onchange 事件 而 firefox 会触发 有人也注意到了吗 这是 Chrome 的一项已知
  • 锁和监视器可以安全地用于同一个对象吗?

    我有以下情况 我想相互排除对对象的访问 到目前为止我通常会使用锁对象 object lockObject new object method1 lock lockObject CODE1 现在我还有一个可以从另一个线程调用的方法 它不应该被
  • 设备中的sign_in_and_redirect如何工作?

    if user persisted sign in and redirect user event gt authentication this will throw if user is not activated set flash m
  • 如何为一组目标创建 Maven 别名?

    我正在配置一个 Maven 项目并希望能够使用别名 例如 mvn server 执行mvn clean package tomcat run Grunt 任务运行器做得很好 但我还没有找到在 Maven 中做同样事情的方法 是否可以 您可以
  • 如何阅读 C 声明?

    我听说过一些方法 但没有一个能坚持下来 就我个人而言 我尝试避免 C 中的复杂类型 并尝试将它们分解为组件 typedef 我现在面临着维护一些来自所谓的 三星级程序员 的遗留代码 并且我很难阅读一些 代码 如何阅读复杂的 C 声明 本文解