pragma指令用于指定特定于计算机或操作系统的编译器功能。其语法为:#pragma token-string
C和C ++编译器可识别的token-string有以下:
1 标记的仅C++支持。更多指令说明及使用请见:https://docs.microsoft.com/en-us/cpp/preprocessor/pragma-directives-and-the-pragma-keyword?view=vs-2019
常用指令如下:
- #pragma once
作用:指定在编译源代码文件时,编译器仅include头文件一次。所以使用#pragma once可以减少构建时间,并且不会引起符号冲突,移植性较好。
// header.h
#pragma once
// 仅包含一次放置在此处的代码
......
保证一个头文件不会被include多次另一种实现方式为#ifndef:
// header.h
#ifndef HEADER_H_
#define HEADER_H_
// 仅包含一次放置在此处的代码
......
#endif // HEADER_H_
-
#pragma auto_inline
选项on
或者off
。作用:打开或关闭inline操作,最好将其放在函数定义之前,不要放在内部。 -
#pragma message( message-string )
作用:在编译时显示参考消息。消息可以是自定义的宏。
#if _M_IX86 >= 500
#pragma message("_M_IX86 >= 500")
#endif
#pragma message("")
#pragma message( "Compiling " __FILE__ )
#pragma message( "Last modified on " __TIMESTAMP__ )
#pragma message("")
// with line number
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message (__FILE__ "[" STRING(__LINE__) "]: test")
#pragma message("")
- #pragma code_seg
#pragma code_seg( [ "section-name" [ , "section-class" ] ] )
#pragma code_seg( { push | pop } [ , identifier ] [ , "section-name" [ , "section-class" ] ] )
作用:指定目标代码存储的段(segment)。
void func1() { // stored in .text
}
#pragma code_seg(".my_data1")
void func2() { // stored in my_data1
}
#pragma code_seg(push, r1, ".my_data2")
void func3() { // stored in my_data2
}
#pragma code_seg(pop, r1) // stored in my_data1
void func4() {
}
int main() {
}
References:
- https://docs.microsoft.com/en-us/cpp/preprocessor/once?view=vs-2019