宏名字不规范,与结构体的成员重名

C++ 最通用的48条编码规范 阅读详情

报错提示:

 

定义了宏名字不规范,与结构体的成员重名,导致了编译的时候提示结构体的这个类型不识别,很久才排除了这个错误!

那么可以通过看预编译的源代码来分析是否被宏进行了替换

 

转载自:http://hi.baidu.com/hp_roc/blog/item/91691146c40de946500ffe39.html

下面转载关于gcc的编译过程及文件的生成

GCC编程四个过程:预处理-编译-汇编-链接

2009年12月09日 星期三 13:14

在Linux下进行C语言编程,必然要采用GNU GCC来编译C源代码生成可执行程序。

一、GCC快速入门
Gcc指令的一般格式为:Gcc [选项] 要编译的文件 [选项] [目标文件]
其中,目标文件可缺省,Gcc默认生成可执行的文件名为:编译文件.out
我们来看一下经典入门程序"Hello World!"
# vi hello.c
#include <stdlib.h>
#include <stdio.h>
void main(void)
{
printf("hello world!\r\n");
}
用gcc编译成执行程序。
#gcc -o hello hello.c
该命令将hello.c直接生成最终二进制可执行程序a.out
这条命令隐含执行了(1)预处理、(2)汇编、(3)编译并(4)链接形成最终的二进制可执行程序。这里未指定输出文件,默认输出为a.out。
如何要指定最终二进制可执行程序名,那么用-o选项来指定名称。比如需要生成执行程序hello.exe
那么
#gcc hello.c -o hello.exe

二、GCC的命令剖析--四步走
从上面我们知道GCC编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤。
GCC编译C源码有四个步骤:预处理-----> 编译 ----> 汇编 ----> 链接
现在我们就用GCC的命令选项来逐个剖析GCC过程。
1)预处理(Pre-processing)
在该阶段,编译器将C源代码中的包含的头文件如stdio.h编译进来,用户可以使用gcc的选项”-E”进行查看。
用法:#gcc -E hello.c -o hello.i
作用:将hello.c预处理输出hello.i文件。
[root]# gcc -E hello.c -o hello.i
[root]# ls
hello.c hello.i
[root]# vi hello.i
# 1 "hello.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "hello.c"
# 1 "/usr/include/stdlib.h" 1 3
# 25 "/usr/include/stdlib.h" 3
# 1 "/usr/include/features.h" 1 3
# 291 "/usr/include/features.h" 3
# 1 "/usr/include/sys/cdefs.h" 1 3
# 292 "/usr/include/features.h" 2 3
# 314 "/usr/include/features.h" 3
# 1 "/usr/include/gnu/stubs.h" 1 3
# 315 "/usr/include/features.h" 2 3
# 26 "/usr/include/stdlib.h" 2 3
# 3 "hello.c" 2
void main(void)
{
printf("hello world!\r\n");
}
2)编译阶段(Compiling)
第二步进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
选项 -S
用法:[root]# gcc –S hello.i –o hello.s
作用:将预处理输出文件hello.i汇编成hello.s文件。
[root@richard hello-gcc]# ls
hello.c hello.i hello.s
如下为hello.s汇编代码
[root@richard hello-gcc]# vi hello.s
.file   "hello.c"
.section    .rodata
.LC0:
.string "hello world!\r\n"
.text
.globl main
.type   main,@function
main:
pushl   %ebp
movl    %esp, %ebp
subl    $8, %esp
andl    $-16, %esp
movl    $0, %eax
subl    %eax, %esp
subl    $12, %esp
pushl   $.LC0
call    printf
addl    $16, %esp
movl    $0, %eax
leave
ret
.Lfe1:
.size   main,.Lfe1-main
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
3)汇编阶段(Assembling)
汇编阶段是把编译阶段生成的”.s”文件转成二进制目标代码.
选项 -c
用法:[root]# gcc –c hello.s –o hello.o
作用:将汇编输出文件test.s编译输出test.o文件。
[root]# gcc -c hello.s -o hello.o
[root]# ls
hello.c hello.i hello.o hello.s
4)链接阶段(Link)
在成功编译之后,就进入了链接阶段。
无选项链接
用法:[root]# gcc hello.o –o hello.exe
作用:将编译输出文件hello.o链接成最终可执行文件hello.exe。
[root]# ls
hello.c hello.exe hello.i hello.o hello.s
运行该可执行文件,出现正确的结果如下。
[root@localhost Gcc]# ./hello
Hello World!

在这里涉及到一个重要的概念:函数库。
读者可以重新查看这个小程序,在这个程序中并没有定义”printf”的函数实现,且在预编译中包含 进的”stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现”printf”函数的呢?最后的答案是:系统把这些函数实现都 被做到名为libc.so.6的库文件中去了,在没有特别指定时,gcc会到系统默认的搜索路径”/usr/lib”下进行查找,也就是链接到 libc.so.6库函数中去,这样就能实现函数”printf” 了,而这也就是链接的作用。
你可以用ldd命令查看动态库加载情况:
[root]# ldd hello.exe
libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
函 数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件 了。其后缀名一般为”.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以 节省系统的开销。动态库一般后缀名为”.so”,如前面所述的libc.so.6就是动态库。gcc在编译时默认使用动态库。

 


【农业生产系统模型】基于R语言APSIM模型进阶应用与参数优化、批量模拟实践技术 APSIM模型有Classic和Next Generation两个系列模型,能模拟几十种农作物、牧草和树木的土壤-植物-大气过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安全、土壤碳周转、环境影响、农业可持续性、农业生态等诸多与农业生产和科研有关的领域。R语言是一门应用场景广泛、简单易学的程序语言,APSIM模型开发了许多R语言辅助包,在APSIM模型的气候、土壤、管理措施等数据准备,自动化模拟,参数优化和结果分析上都发挥着重要的作用。案例一:APSIM模型输入参数和土壤文件的制备。 阅读详情

相关推荐

从零到一:手把手教你用STM32和WiFi打造智能温室大棚的物联网核心

本文详细介绍了如何利用STM32单片机和WiFi技术从零构建智能温室大棚的物联网核心系统。内容涵盖硬件选型、传感器集成、低功耗WiFi通信、自动控制逻辑及OLED显示,提供实际部署中的优化技巧和故障排查方案,帮助开发者打造稳定可靠的农业自动化解决方案。

c7d8e的博客 179

定义宏时千万不要把宏的“参数名”和宏中用到的结构体成员名相同!

C语言中的宏非常强大,可以利用宏来一些要经常用到的操作封装在一起,或者有时仅仅只是让代码看起来更整洁些,但是宏是没有类型检查的,所以使用时千万要小心。但是有时也可以利用宏的没有类型检查这个特性,实现一些特殊的需求。举个简单的例子来说,下面的两个函数:int conf_add_fd(conf_snd_t *conf_snd, int fd) { fd_snd_t *fd_snd =

Justlinux2010的专栏 3308

使用MLP解决OCR问题(OpenCV)(下)

分类模型:        分类模型涉及的一个比较关键的问题就是输出的10维向量是如何与具体的类别挂钩的。实际上:10维向量的每一位都代表一类,在对于训练集的表达中,如果输入数据是0,则10维向量的第一位赋值为1,其余均为0。即0对应[1,0,0,0,0,0,0,0,0,0]。MLP模型训练完成后,就需要对用户输入的数据所属类别进行判定。这时得到的输出数据基本不可能是正好的所属类为1,其他位置为0

qq_18515405的专栏 1906

宏定义#define 和该文件下使用到的结构体成员的名称一样,导致失败

在后面使用到了一个结构体变量,它的名称也刚好是和宏定义的名称相同,这样就导致变异失败了,原因是宏定义的优先级比较高,会优先替换该目录下的文件里面相同名字的变量,导致后面使用到这个名称的使用都会被替换掉,导致编译失败。这种写法也属于宏定义名称的不规范, 默认宏定义的名称要全大写,结构体的成员默认用小写,这样就能避免冲突。在文件头定义了一个这个宏定义。

qq_35120460的博客 702

手把手教你学基于 Linux 的 NPU 固件开发-第 10 讲:可靠性设计(RAS)——让系统坚如磐石错误检测、纠正与上报机制(ECC、Parity)

组件推荐保护机制备注HBM/DDRScrubbing必须开启,定期巡检片上 SRAMECC(权重/激活值),Parity(指令)权衡面积与可靠性计算单元ABFT或DMR(关键路径)防止计算逻辑错误片上网络CRC重传保证数据传输完整性系统软件AER 上报CE 监控自动恢复闭环管理,杜绝 SDC运维策略预测性维护Checkpoint变被动为主动核心心法(信任硬件,但必须验证。在纳米尺度下,错误是必然发生的物理现象。

MHD0815的博客 91

【OpenClaw从入门到精通】第13篇:OpenClaw低代码编排实战:非技术人员也能玩转AI自动化流程(2026新版实测)

本文聚焦OpenClaw 2026版核心升级的低代码编排能力,针对非技术人员的实操需求,从底层逻辑、双环境部署、三类实战案例、避坑指南四个维度展开。详解阿里云集群版(企业级)与汉化本地版(个人调试)的部署步骤,通过基础数据统计、公众号内容生产线、企业级任务调度三个递进式案例,演示可视化拖拽搭建自动化流程的完整过程。全程零代码/低代码操作,配套详细参数配置、执行结果模拟及问题排查方案,帮助销售、运营、自媒体等非技术人员快速掌握自动化工具,将重复工作交给AI,提升核心工作效率。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 616

结构体类型重声明导致的bug一个

bug前提条件 当模块比較多。头文件较多,某个结构体类型会在当前模块中又一次声明进而引用其成员,而不直接包括其它模块的头文件。这种优点是不引入不须要的类型声明到此模块。头文件包括的交叉;坏处是,添加了bug的几率,耦合太大!比方以下一种情况发生而导致bug: 已知两个模块A和B。同一个结构类型struct node在两个模块中分别声明。当中B模块无意或者有意调整了结构类型中的某些域。那...

weixin_33943836的博客 201

5.7 BGP属-ORIGIN

注意:当去往同一个目的地存在多条不同Origin属性的路由时,在其他条件都相同的情况下,BGP将按如Origin的下顺序优选路由:IGP > EGP > Incomplete。通过以上输出可以看到路由表选择了R3发过来的路由,因为R1的路由的起源为?通过以上输出我们可以看到针对于1.1.1.1这条路由有两条,从R1和R3传过来的起源都属于IGP。(4)把从R1传过来的路由的起源改为incomplete。通过以上输出可以看到,从R1传过来的路由是最优的。(2)在R2上查看1.1.1.1的路由详细信息。

lwljh134的博客 308

结构中的变量可以和别的变量重名吗?

结构体中的成员变量名,与非结构体变量没有关系,可以相同。 因为,结构体中的成员变量在引用时, 必须要用结构体变量名+成员变量名来引用,所以不会有冲突!

QWQ___qwq的博客 2602

MuJoCo 入门教程(八)Model仓库

一个物理仿真器的好坏取决于它所仿真的模型,而在像 MuJoCo 这样功能强大、建模选项众多的仿真器中,很容易创建出行为与预期不符的 "坏 "模型。MuJoCo Menagerie 的目标是为社区提供一个设计精良、开箱即用的模型集。更多信息,请访问 Menagerie 资源库。

机器人控制与仿真应用 1940

Unity 工具 之 ZXing QRCode 二维码的生成和识别(可设置生成不同颜色的/带图标的二维码)

Unity 基础 之 ZXing QRCode 二维码的生成和识别(可设置生成不同颜色的/带图标的二维码) 目录 Unity 基础 之 ZXing QRCode 二维码的生成和识别(可设置生成不同颜色的/带图标的二维码) 一、简单介绍 二、实现原理 三、注意实现 四、效果预览 五、ZXing.net ( zxing.unity.dll ) 插件下载 六、实现步骤 七、关键代码 一、简单介绍 Unity 开发中,自己整理的一些游戏开发可能用到的功能,整理归档,方便游...

仙魁XAN 9824

C++编程命名规范

命名规范

保持分享欲 1966

从询价到回款:一篇讲透 SAP SD 销售与分销的实战入门指南

摘要: SAP SD(Sales and Distribution)模块是SAP ERP中管理销售与分销的核心组件,贯穿从订单到回款(Order-to-Cash)的全流程。其核心价值在于将销售业务结构化,通过主数据(客户、物料、定价)和交易单据(订单、交货、发票)实现流程可审计、可自动化。SD模块与物流(MM)、生产(PP)、财务(FI)深度集成,涵盖定价策略、信用控制、发运管理、国际贸易等复杂场景。关键设计包括条件技术(Condition Technique)实现灵活定价,单据流(Document Flo

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 258

C语言 结构体

摘要:整型数据在内存中以补码形式存储,便于统一处理符号位和数值运算。正数的原码、反码、补码相同,负数则需转换。大端和小端是两种字节序存储方式,区别在于高低位的存放顺序。浮点数存储采用IEEE 754标准,分为符号位、指数位和尾数位,其读取规则与整型不同。通过代码示例展示了整型和浮点型数据在内存中的存储差异及读取方式。

zhangx1234_的博客 665

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++命名规范总结

​ 如果想要有效的管理一个稍微复杂一点的体系,针对其中事物的一套统一、带层次结构、清晰明了的命名准则就是必不可少而且非常好用的工具。在软件开发这一高度抽象而且十分复杂的活动中,命名规则的重要性更显得尤为突出。一套定义良好并且完整的、在整个项目中统一使用的命名规范将大大提升源代码的可读性和软件的可维护性。

qq_40935205的博客 3986

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

结构体的理解

记录对于结构体知识的了解上面我们说了struct定义出来的复杂数据类型和基本数据类型是一样的地位,都是类型,那么自然的定义变量的方式也是一样的;基本数据类型是怎么定义的我们就怎么定义:红色部分是我们的类型,黑色部分是变量;1、位段与结构体的声明是类似的,但是位段的成员必须是int、unsigned int、signedint、char;2、位段的成员名后面有一个“ : ”和一个数字,以";"结尾;3、访问的方式与结构体一样(可以通过点操作符和箭头操作符);4、位段不存在内存对齐;

南猿北者博客 2659

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MFC、句柄、控件及结构的命名规范

Windows类型 样本变量 MFC类 样本变量 HWND hWnd; CWnd* pWnd; HDLG hDlg; CDialog* pDlg; HDC hDC; CDC* pDC; HGDIOBJ

quietball的专栏 2705

C++命名规范【转】

原文:http://blog.youkuaiyun.com/huayehanshan/article/details/3860363 在软件开发过程中,代码的命名规范是一项很突出的内容。一套定义完整、结构清晰明了的命名规范将大大提升源代码的可读性和软件的可维护性。 据考证,没有一种命名规则可以让所有的程序员都满意,程序设计教科书一般也不会指定命名规则。但是制定一套令开发组成员基本满意的命名...

weixin_30858241的博客 90

keil 结构体引用_结构体及其方法

结构体类型基础知识结构体表示的是实实在在的数据结构。一个结构体类型可以包含若干个字段,每个字段通常都需要有确切的名字和类型。结构体也可以不包含任何字段,我们还可以为类型关联上一些方法,这里可以把方法看成是函数的特殊版本。函数是独立的程序实体。可以声明有名字的函数,也可以声明没名字的函数,还可以把函数当成普通的值传来传去。可以把具有相同签名的函数抽象成独立的函数类型,作为一组输入、输出(或...

weixin_39914243的博客 2704

C/C++中的结构体typedef struct和struct

即使没有显式的标签名称,而到底使用什么来作为结构体命名空间的标签就取决于不同的编译器,若编译器就是与类型别名node_t建立关联,编译时就会产生重定义的错误。类似“redefinition of ‘struct node_t’ struct node_t”和“previous definition of ‘struct node_t’ typedef struct node_t”。1、使用typedef,将匿名结构体定义别名,此法不能使用struct Node定义对象,也不能前向声明。

m0_55957195的博客 533

kernel一般编码规范

一般编码规范函数缩进不要用typedef宏,枚举分配内存命名 -- 给命名内涵条件编译空行函数返回值鲁棒性:硬代码时延的方法 函数 函数应该简短而漂亮,并且只完成一件事情。 一个函数的最大长度是和该函数的复杂度和缩进级数成反比的。 比如一个函数仅是一个很长的(但很简单的)switch语句, 有很多个case,而且在每个case里都是做很小的事情,这样的函数尽管很长,但也是可以的。 不过,如果你有一个复杂的函数,而且你怀疑一个天分不是很高的高中一年级学生可能甚至搞不清楚这个函数的目的,你应该严格遵守前面提到

The simple, The best. 1089

c++命名规范

 在引入细节之前,先说明一下命名规范的整体原则:同一性在编写一个子模块或派生类的时候,要遵循其基类或整体模块的命名风格,保持命名风格在整个模块中的同一性。 标识符组成标识符采用英文单词或其组合,应当直观且可以拼读,可望文知意,用词应当准确。最小化长度 && 最大化信息量原则在保持

1070

Go语言规范2 - 命名篇

文章目录命名篇2.1 基本命令规范2.2 项目目录名2.3 包名2.4 文件名2.5 常量2.6 变量变量申明变量命名惯例全局变量名局部变量名循环变量2.7 结构体(struct)2.8 接口名2.9 函数和方法名函数方法2.10 参数名2.11 返回值 命名篇 本篇以开发时从上往下的顺序既:开发前约定的基本命名规范、包、常量、变量、结构体、参数、返回值的顺序讲解了开发中各个环...

Survivalist_Boy的博客 1637

C++之名字空间(namespace)

摘要: C++的名字空间(namespace)用于解决命名冲突问题,通过为变量、函数、类等添加作用域前缀实现代码隔离(类似文件夹区分同名文件)。定义时支持嵌套和跨文件合并,成员通过空间名::成员名访问。使用方式包括:全前缀访问(推荐)、单个成员引入(using 空间名::成员)或整个空间展开(using namespace 空间名)。标准库std默认封装在名字空间中以避免冲突。名字空间声明(using 空间名::成员)将成员直接加入当前作用域定义表(高优先级),而名字空间指令(using namespace

2601_96594232的博客 442
上一篇: gch文件之浅谈GCC预编译头技术
下一篇: man c++手册
RunBoying
博客等级 码龄17年 41粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值