环境为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),则:

sizeof(ROBO_PORT_CTRL_STRUC) = 3

如果没有设置#pragma pack(1),则:

sizeof(ROBO_PORT_CTRL_STRUC) = 4
一般情况下使用编译器缺省的对齐方式即可,但是总有些例外情况需要设置#pragma pack()参数,但是设置完了以后,想要恢复到原来缺省的对齐方式怎么办?因为Tornado实际上使用的是GCC编译器,因此查找了一下GCC的帮助,原文如下(中文是我自己的翻译):

1、#pragma pack(n) simply sets the new alignment.

#pragma pack(n),就是设置新的对齐方式为n

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).

#pragma pack(),将对齐方式恢复为原来的初始值(可以参见命令行编译选项-fpack-struct[=n])

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)恢复原来的设置。

从上面的说明可以总结出如下的几种配对使用方式,并附上在Tornado2.2,VxWorks5.5的环境下的编译结果:
使用方法
编译结果
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相关推荐

  1. ORA-00907:missing right parenthesis缺少右括号

    一,有嵌套查询,并且子查询中用了union all合并两个查询时,前一个查询用了order by,那么会报错并提示ORA-00907:missing right parenthesis缺少右括号: s ...

  2. ORA-00906 missing left parenthesis括号

    Oracle 建表报错:ORA-00906 missing left parenthesis括号     建表语句:create table test(id char,name varchar(1), ...

  3. Keil5遇到error:#8:missing closing quote 处理

    MDK5采用UTF-8,提示很多个这样的error:#8:missing closing quote 的错误信息.提供以下几种方式解决: 第一种: 把报错提示的文件(包括.c和对应.h)用Notepa ...

  4. 从编译原理看一个解释器的实现

    『设计模式』中有一个模式可以解释特定的语法规则,它就是解释器模式(Interpreter Pattern).不同于常见的策略模式或者是工厂模式,解释器模式在.NET或者JDK中并不常见,而且在业务上也 ...

  5. 计算机游戏者战略编写员教程

     计算机游戏者战略编写员教程 人工智能专家参考文件 世纪帝国 II ®:征服者入侵 (繁体中文版) 原作:全效工作室 翻译暨校对:狂-剧情狂 游戏编辑设计公会.站长群之一 游戏编辑设计公会联盟.盟 ...

  6. ORA_ERROR大全

    常见错误: -60 ORA00060: deadlock detected while waiting for resource 一般错误:   - 1 ORA00001: unique constr ...

  7. ORACLE ERROR大全

    ORA_ERROR大全 1 ORA00001: unique constraint (.) violated -17 ORA00017: session requested to set trace ...

  8. fatal error C1004unexpected end of file found

    msdn 里关于error C1004的描述如 929 说的. 我想最大的可能还是类和结构定义的右括号"}"后少了":" 着重检查头文件.若有问题的头文件在多处 ...

  9. 【Codeforces】Round #375 (Div. 2)

    Position:http://codeforces.com/contest/723 我的情况 啊哈哈,这次raiting肯定要涨,接受过上次的教训,先用小号送肉,大号都是一发切,重回蓝咯 结果... ...

最新文章

  1. Handler实现与机制 Blocking Queue IdleHandler使用
  2. JVM命令查看与设置参数
  3. 如何用C代码生成二维码
  4. WinCE6下的kernelIoControl使用方法
  5. ARM不同位数系统int字节数区别
  6. JDK源码解析之 java.lang.Class
  7. 如何在ashx页面获取Session值 (仅供个人参考)
  8. Dom4j 解析Xml文档及 XPath查询 学习笔记
  9. 一次函数的斜率公式_【海广教育数学口诀】初中数学学不会?公式这样记,让你做题效率翻倍!...
  10. WPF如何给窗口设置透明png的图片背景
  11. python list 元素位置_Python将list中某个元素移至末尾
  12. 瀚云平台kafka简单原理
  13. No package 'libxml-2.0' found
  14. vue脚手架学习笔记
  15. Xmodem Ymodem Zmodem 协议
  16. windows下Python集成开发环境-Spyder安装和使用
  17. 面向对象编程的方式搭建CNN网络 | PyTorch系列(十三)
  18. HDU1166 敌兵布阵【线段树】题解
  19. 常用的行列式和矩阵的性质
  20. power supply是如何上报电池信息的

热门文章

  1. python requests post 中文乱码问题
  2. VM虚拟机 Windows虚拟机中linux鼠标不能动怎么办
  3. 在Redhat 5.0 上安装Eclipse 3.6
  4. 把一个人的特点写具体作文_把一个人的特点写具体500字作文
  5. C语言 —— 关键字(C语言标准定义的32个关键字:auto、register、static、sizeof、signed、unsigned 、break 、 continue 、void)
  6. Windows下phpStudy中的Apache无法启动的排查方法
  7. Spring MVC - URL路径映射
  8. vmware开发包之vSphere Management SDK
  9. WF 4.0 之持久化操作一:SqlServer方式的存储
  10. 在C#中利用DirectX实现声音播放(winForm)