missing closing parenthesis at end of #pragma
环境为Tornado2.2,VxWorks5.5
编译出现警告如下:
warning: missing closing parenthesis at end of #pragma warning: Unrecognised value for #pragma pack directive. warning: malformed `#pragma pack' |
#ifndef _CFE_ #pragma pack(1)
#endif
typedefstruct _ROBO_PORT_CTRL_STRUC
{
unsigned charrx_disable;
unsigned shorttx_disable;
} ROBO_PORT_CTRL_STRUC;
#ifndef _CFE_ #pragma pack()
#endif
|
问题出在编译的预处理指令#pragma上,在C语言中,预处理指令#pragma pack(n)是负责确定结构类型数据结构体内各个变量在内存中地址对齐方式的,第一、如果n大于等于结构体中长度最大的变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。更加详细的内容请自己Google之。
对于本例来说,如果设置了#pragma pack(1),则:
如果没有设置#pragma pack(1),则:
1、#pragma pack(n) simply sets the new alignment.
2、#pragma pack() sets the alignment to the one that was in effect when compilation started (see also command-line option -fpack-struct[=n] see Code Gen Options).
3、#pragma pack(push[,n]) pushes the current alignment setting on an internal stack and then optionally sets the new alignment.
#pragma pack(push[,n]),将当前的对齐方式存入内部堆栈,然后设置新的对齐方式为n
4、#pragma pack(pop) restores the alignment setting to the one saved at the top of the internal stack (and removes that stack entry). Note that #pragma pack([n]) does not influence this internal stack; thus it is possible to have #pragma pack(push) followed by multiple #pragma pack(n) instances and finalized by a single #pragma pack(pop).
#pragma pack(pop),恢复堆栈内保存的对齐方式,需要注意的是,单独使用#pragma pack([n])指令它只设置新的对齐方式,而不会把当前对齐方式放入堆栈。可以用#pragma pack(push)指令将当前的对齐方式入栈,然后再使用#pragma pack([n])指令设置新的对齐方式,最后使用#pragma pack(pop)恢复原来的设置。
使用方法
|
编译结果
|
|
1
|
#pragma pack(push)
#pragma pack(1)
……
#pragma pack(pop)
|
有警告,发生在#pragma pack(pop)那一行,内容如下:
missing closing parenthesis at end of #pragma Extraneous characters at end of #pragma pack Unrecognised value for #pragma pack directive.
malformed `#pragma pack'
|
2
|
#pragma pack(push,1)
……
#pragma pack(pop)
|
有警告,发生在#pragma pack(push,1)和#pragma pack(pop)这两行,内容同上
|
3
|
#pragma pack(push)
#pragma pack(1)
……
#pragma pack()
|
有警告,发生在#pragma pack()那一行,内容同上
|
4
|
#pragma pack(push,1)
……
#pragma pack()
|
有警告,发生在#pragma pack(push,1)和#pragma pack()这两行,内容同上
|
使用方法
|
运行结果说明
|
|
1
|
#pragma pack(push)
#pragma pack(1)
……
#pragma pack(pop)
|
#pragma pack(1)指令起作用,后续结构体定义按照新的对齐方式进行对齐,而#pragma pack(pop)不起作用,后续的结构体依然按照#pragma pack(1)的方式对齐
|
2
|
#pragma pack(push,1)
……
#pragma pack(pop)
|
#pragma pack(push,1)不起作用,依然按照缺省方式对齐。
|
3
|
#pragma pack(push)
#pragma pack(1)
……
#pragma pack()
|
#pragma pack(1)指令起作用,后续结构体定义按照新的对齐方式进行对齐,而#pragma pack()不起作用,后续的结构体依然按照#pragma pack(1)的方式对齐
|
4
|
#pragma pack(push,1)
……
#pragma pack()
|
#pragma pack(push,1)不起作用,依然按照缺省方式对齐。
|
经过多次试验和研究,终于发现使用#pragma pack(0)就没有编译错误,而且可以实现恢复缺省的对齐方式。
最后声明,本解决方案是在Tornado2.2 + VxWorks5.5下编译测试通过,其它环境没有测试,上述结果仅供参考。
missing closing parenthesis at end of #pragma相关推荐
- ORA-00907:missing right parenthesis缺少右括号
一,有嵌套查询,并且子查询中用了union all合并两个查询时,前一个查询用了order by,那么会报错并提示ORA-00907:missing right parenthesis缺少右括号: s ...
- ORA-00906 missing left parenthesis括号
Oracle 建表报错:ORA-00906 missing left parenthesis括号 建表语句:create table test(id char,name varchar(1), ...
- Keil5遇到error:#8:missing closing quote 处理
MDK5采用UTF-8,提示很多个这样的error:#8:missing closing quote 的错误信息.提供以下几种方式解决: 第一种: 把报错提示的文件(包括.c和对应.h)用Notepa ...
- 从编译原理看一个解释器的实现
『设计模式』中有一个模式可以解释特定的语法规则,它就是解释器模式(Interpreter Pattern).不同于常见的策略模式或者是工厂模式,解释器模式在.NET或者JDK中并不常见,而且在业务上也 ...
- 计算机游戏者战略编写员教程
计算机游戏者战略编写员教程 人工智能专家参考文件 世纪帝国 II ®:征服者入侵 (繁体中文版) 原作:全效工作室 翻译暨校对:狂-剧情狂 游戏编辑设计公会.站长群之一 游戏编辑设计公会联盟.盟 ...
- ORA_ERROR大全
常见错误: -60 ORA00060: deadlock detected while waiting for resource 一般错误: - 1 ORA00001: unique constr ...
- ORACLE ERROR大全
ORA_ERROR大全 1 ORA00001: unique constraint (.) violated -17 ORA00017: session requested to set trace ...
- fatal error C1004unexpected end of file found
msdn 里关于error C1004的描述如 929 说的. 我想最大的可能还是类和结构定义的右括号"}"后少了":" 着重检查头文件.若有问题的头文件在多处 ...
- 【Codeforces】Round #375 (Div. 2)
Position:http://codeforces.com/contest/723 我的情况 啊哈哈,这次raiting肯定要涨,接受过上次的教训,先用小号送肉,大号都是一发切,重回蓝咯 结果... ...
最新文章
- Handler实现与机制 Blocking Queue IdleHandler使用
- JVM命令查看与设置参数
- 如何用C代码生成二维码
- WinCE6下的kernelIoControl使用方法
- ARM不同位数系统int字节数区别
- JDK源码解析之 java.lang.Class
- 如何在ashx页面获取Session值 (仅供个人参考)
- Dom4j 解析Xml文档及 XPath查询 学习笔记
- 一次函数的斜率公式_【海广教育数学口诀】初中数学学不会?公式这样记,让你做题效率翻倍!...
- WPF如何给窗口设置透明png的图片背景
- python list 元素位置_Python将list中某个元素移至末尾
- 瀚云平台kafka简单原理
- No package 'libxml-2.0' found
- vue脚手架学习笔记
- Xmodem Ymodem Zmodem 协议
- windows下Python集成开发环境-Spyder安装和使用
- 面向对象编程的方式搭建CNN网络 | PyTorch系列(十三)
- HDU1166 敌兵布阵【线段树】题解
- 常用的行列式和矩阵的性质
- power supply是如何上报电池信息的
热门文章
- python requests post 中文乱码问题
- VM虚拟机 Windows虚拟机中linux鼠标不能动怎么办
- 在Redhat 5.0 上安装Eclipse 3.6
- 把一个人的特点写具体作文_把一个人的特点写具体500字作文
- C语言 —— 关键字(C语言标准定义的32个关键字:auto、register、static、sizeof、signed、unsigned 、break 、 continue 、void)
- Windows下phpStudy中的Apache无法启动的排查方法
- Spring MVC - URL路径映射
- vmware开发包之vSphere Management SDK
- WF 4.0 之持久化操作一:SqlServer方式的存储
- 在C#中利用DirectX实现声音播放(winForm)