#pragma
C中有哪些用途,有例子?
#pragma
用于特定于机器或特定于操作系统的编译器指令,即它告诉编译器执行某些操作,设置一些选项,执行某些操作,覆盖某些默认值等,这些操作可能适用于所有机器并可能不适用于所有机器和操作系统.
有关详细信息,请参阅msdn.
#pragma
用于在C中执行特定于实现的内容,即对于当前上下文而不是意识形态教条是务实的.
我经常使用的是#pragma pack(1)
我试图在嵌入式解决方案上挤出更多内存空间的地方,结构数组最终会以8字节对齐方式结束.
可惜我们还没有#dogma
.这应该很有趣 ;)
如果可能的话,我通常会尽量避免使用#pragmas,因为它们非常依赖于编译器且不可移植.如果你想以便携方式使用它们,你必须使用#if
/ #endif
pair 包围每个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
/ #endif
pair 包围每个pragma .不漂亮.
放在#pragma once
头文件的顶部将确保它只包含一次.请注意,这#pragma once
不是标准C99,但大多数现代编译器都支持.
另一种方法是使用包含防护装置(例如#ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */
)
我觉得这#pragma
是一个指令,如果你想让代码是特定于位置的.在某种情况下,你希望程序计数器从写入ISR的特定地址读取,那么你可以在那个位置指定ISR使用#pragma vector=ADC12_VECTOR
和跟随中断rotines名称及其描述
我最好的建议是查看编译器的文档,因为pragma是定义特定于实现的.例如,在嵌入式项目中,我使用它们在不同的部分中定位代码和数据,或者声明中断处理程序.即:
#pragma code BANK1 #pragma data BANK2 #pragma INT3 TimerHandler