什么是一些应用#pragma
在C,有例子吗?
什么是一些应用#pragma
在C,有例子吗?
Answers:
#pragma
用于在C语言中执行特定于实现的事情,即在当前上下文中务实,而不是从思想上教条。
我经常使用的#pragma pack(1)
那个是我试图在嵌入式解决方案上从我的内存空间中挤出更多空间的方法,这些方法的结构数组最终会导致8字节对齐。
可惜我们还没有#dogma
。这应该很有趣 ;)
pragma(1)
有效提高速度?见stackoverflow.com/questions/3318410/...
如果可能的话,我通常会尽量避免使用#pragmas,因为它们非常依赖于编译器且不可移植。如果要以可移植的方式使用它们,则必须用#if
/ 包围每个编译指示#endif
。GCC不鼓励使用编译指示,实际上仅支持其中一些与其他编译器兼容。GCC还有其他方式可以执行其他编译器使用的编译指示相同的操作。
例如,这是您如何确保结构在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
对将每个编译指示括起来。不漂亮。
struct __attribute__((__packed__)) PackedStructure
hack
在遇到无法识别的杂项时运行,因为它很久以前曾经使用过,请参见#pragma
GCC等)
最好的建议是查看编译器的文档,因为编译指示从定义上讲是特定于实现的。例如,在嵌入式项目中,我已使用它们在不同部分中定位代码和数据,或声明中断处理程序。即:
#pragma code BANK1
#pragma data BANK2
#pragma INT3 TimerHandler
上面的所有答案都为您提供了很好的解释,#pragma
但我想举一个小例子
我只想解释一个simple OpenMP example
演示#pragma
其工作用途的方法
OpenMp
briefly
是用于多平台共享内存并行编程的实现(那么我们可以说是machine-specific
或operating-system-specific
)
让我们来看这个例子
#include <stdio.h>
#include <omp.h>// compile with: /openmp
int main() {
#pragma omp parallel num_threads(4)
{
int i = omp_get_thread_num();
printf_s("Hello from thread %d\n", i);
}
}
输出是
Hello from thread 0
Hello from thread 1
Hello from thread 2
Hello from thread 3
Note that the order of output can vary on different machines.
现在让我告诉你是怎么回事#pragma
...
它告诉操作系统在4个线程上运行一些代码块
这只是many many applications
您可以使用的一小部分#pragma
对不起外部样品 OpenMP
总结起来,#pragma
告诉编译器做一些事情。这是我使用它的几种方法:
#pragma
可用于忽略编译器警告。例如,要使GCC关闭隐式函数声明,可以编写:
#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
较旧版本的libportable
做到这一点可移植。
#pragma once
,当写在头文件的顶部时,将导致所述头文件被包含一次。一旦获得支持,便libportable
检查杂物。
#pragma
指令在预处理阶段仍然有效。与#include
和不同#define
。