当前位置:  开发笔记 > 编程语言 > 正文

在C中使用#pragma

如何解决《在C中使用#pragma》经验,为你挑选了6个好方法。

#pragmaC中有哪些用途,有例子?



1> Steven A. Lo..:

#pragma 用于特定于机器或特定于操作系统的编译器指令,即它告诉编译器执行某些操作,设置一些选项,执行某些操作,覆盖某些默认值等,这些操作可能适用于所有机器并可能不适用于所有机器和操作系统.

有关详细信息,请参阅msdn.


"这可能适用于所有机器和操作系统,也可能不适用." - 和同一台机器上的不同编译器.这可能对不同的编译器意味着不同的东西.

2> SmacL..:

#pragma 用于在C中执行特定于实现的内容,即对于当前上下文而不是意识形态教条是务实的.

我经常使用的是#pragma pack(1)我试图在嵌入式解决方案上挤出更多内存空间的地方,结构数组最终会以8字节对齐方式结束.

可惜我们还没有#dogma.这应该很有趣 ;)


然后我们需要#karma来覆盖(运行)#dogma
@Pacerier,通常不是.根据jalfs注释,对于32位处理器的4字节边界或64位处理器的8字节边界对齐的数据通常将被加载并存储在单个操作中.在较小边界上对齐的数据将需要多个操作来加载或存储.这比较慢.

3> Adam Rosenfi..:

如果可能的话,我通常会尽量避免使用#pragmas,因为它们非常依赖于编译器且不可移植.如果你想以便携方式使用它们,你必须使用#if/ #endifpair 包围每个pragma .GCC不鼓励使用pragma,实际上只支持其中一些与其他编译器的兼容性; GCC还有其他方法可以执行与其他编译器使用pragma相同的操作.

例如,以下是如何确保在MSVC中紧密打包结构(即成员之间没有填充):

#pragma pack(push, 1)
struct PackedStructure
{
  char a;
  int b;
  short c;
};
#pragma pack(pop)
// sizeof(PackedStructure) == 7

以下是你在GCC中做同样事情的方法:

struct PackedStructure __attribute__((__packed__))
{
  char a;
  int b;
  short c;
};
// sizeof(PackedStructure == 7)

GCC代码更具可移植性,因为如果你想用非GCC编译器编译它,你所要做的就是

#define __attribute__(x)

而如果要移植MSVC代码,则必须用#if/ #endifpair 包围每个pragma .不漂亮.


所以如果我想在MSVC上编译GCC代码并且需要打包结构我该怎么做呢?
对于gcc,它是`struct __attribute __((__ packed__))PackedStructure`

4> Schildmeijer..:

放在#pragma once头文件的顶部将确保它只包含一次.请注意,这#pragma once不是标准C99,但大多数现代编译器都支持.

另一种方法是使用包含防护装置(例如#ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */)



5> 小智..:

我觉得这#pragma是一个指令,如果你想让代码是特定于位置的.在某种情况下,你希望程序计数器从写入ISR的特定地址读取,那么你可以在那个位置指定ISR使用#pragma vector=ADC12_VECTOR和跟随中断rotines名称及其描述



6> Justin Love..:

我最好的建议是查看编译器的文档,因为pragma是定义特定于实现的.例如,在嵌入式项目中,我使用它们在不同的部分中定位代码和数据,或者声明中断处理程序.即:

#pragma code BANK1
#pragma data BANK2

#pragma INT3 TimerHandler


所有pragma都是特定于实现的 - 除了#pragma STDC ... pragma,它们在所有平台上都是标准化的(除了C99之外).
推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有