C 语言中的 #pragma 指令
C 语言中的 #pragma 指令是什么?
在 C/C++ 语言中,预处理器指令 #pragma 用于向编译器提供附加信息。编译器会使用这些信息来提供一些特殊功能。
请注意,pragma 指令依赖于编译器。并非所有编译器都支持所有 pragma 指令。
语法
以下是在 C/C++ 语言中使用 #pragma 指令的语法 -
#pragma token_name
C 语言中 Pragma 指令的类型
C/C++ 语言中部分 #pragma 指令的表格如下:
指令 | 描述 |
---|---|
#pragma startup | 在执行main() 中,需要运行 pragma 中指定的函数。 |
#pragma exit | 程序结束前,需要运行 pragma 中指定的函数。 |
#pragma warn | 用于隐藏警告信息。 |
#pragma GCC dependency | 检查当前文件和其他文件的日期。如果其他文件是最近的,则会显示警告消息。 |
#pragma GCC system_header | 它将当前文件的代码视为来自系统头文件。 |
#pragma GCC poison | 用于阻止程序中的标识符。 |
#pragma once | 编译器仅加载头文件一次。 |
#pragma startup and exit
这些 pragma 指令在 main() 函数 之前和之后执行。并非所有编译器都支持这些指令。
示例
以下代码演示了如何使用 pragma startup 和 exit 指令 -
#include <stdio.h> int display(); #pragma startup display #pragma exit display int main(){ printf(" I am in main function"); return 0; } int display() { printf(" I am in display function"); return 0; }
输出
运行此代码时,将产生以下输出 -
I am in main function
#pragma warn
#pragma warn 指令用于隐藏或显示编译期间显示的警告信息。
warn 指令的使用方法如下:语法 −
#pragma warn +xxx(显示警告) #pragma warn -xxx(隐藏警告) #pragma warn .xxx(切换显示和隐藏)
需要使用的三个字符代码分别为:rvl(返回值)、par(是否使用参数)和 rch(代码是否无法访问)。
如果任何字符代码以"+"为前缀,则表示显示警告;以""为前缀表示指示编译器隐藏警告,以点 (.) 为前缀则指示编译器在隐藏和显示警告之间切换。
示例
以下示例展示了如何在 C 程序中使用 warn 编译指示 -
#include <stdio.h> #pragma warn -rvl /* 返回值 */ #pragma warn +par /* 从未使用过的参数 */ #pragma warn rch /* 无法访问的代码 */ int square(int x){ printf("Hello World"); } int main(){ square(10); return 0; }
输出
运行此代码时,将产生以下输出 -
Hello World
#pragma GCC poison
GCC 编译器会从程序中彻底移除标识符。如果我们想要屏蔽某个标识符,可以使用 #pragma GCC poison 指令。其语法如下:-
#pragma GCC poison identifier
示例
在本例中,我们将使用 GCC poison 指令来屏蔽 printf() 函数 -
#include <stdio.h> #pragma GCC poison printf int main(){ int a = 10; if (a == 10) { printf("Hello World"); } else printf("TutorialsPoint"); return 0; }
输出
当您尝试编译此代码时,它将显示以下错误 -
error: attempt to use poisoned "printf"
#pragma GCC dependency
此指令允许您检查当前文件与另一个文件的相对日期。如果另一个文件比当前文件更新,则会发出警告。
示例
请看以下示例 -
#include <stdio.h> #pragma GCC dependency "depends.c" int main(){ printf("Hello, World!"); return 0; }
输出
上述源代码依赖于depends.c。如果其编译时间戳较新,则会发出以下警告 -
warning: current file is older than depends.c
#pragma GCC system_header
按照惯例,系统头文件放在#include 指令前面的尖括号中,而非系统头文件则放在引号中。如果您希望编译器将后者视为系统头文件,请使用此指令。
语法
#pragma GCC system_header
library.h
我们在当前目录中定义了一个"library.h"头文件。
#ifndef LIBRARY_H #define LIBRARY_H #pragma GCC system_header void myFunction(); #endif
示例
要让编译器将"library.h"视为系统头文件,请使用#pragma GCC system_header。
#include <stdio.h> #include "library.h" int main(){ myFunction(); // 使用 library.h 中的函数 printf("Hello, World! "); return 0; }
#pragma once
#pragma once 指令使头文件仅被包含一次,即使程序员多次包含它。
将"myheader.h"文件保存为 -
myheader.h
#pragma once void myFunction();
示例
在另一个代码(main.c)中,按如下方式调用 myFunction() -
#include <stdio.h> #include "myheader.h" int main(){ myFunction(); printf("Hello, World! "); return 0; }