C语言中的#pragma 指令



什么是 C 语言中的 #pragma 指令?

预处理器指令#pragma 用于向 C/C++ 语言中的编译器提供其他信息。编译器使用它来提供一些特殊的功能。

请注意,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 和 exit

这些 pragma 指令在main() 函数之前和之后执行。并非所有编译器都支持这些指令。

示例

以下代码演示了如何使用 pragma startup 和 exit 指令:

#include <stdio.h>

int display();

#pragma startup display
#pragma exit display

int main(){

   printf("\nI am in main function");
   return 0;
}

int display() {
   printf("\nI am in display function");
   return 0;
}

输出

运行此代码时,将产生以下输出:

I am in main function

#pragma warn

#pragma warn 指令用于隐藏或显示编译期间显示的警告消息。

warn pragma 的使用方法如下所示语法

#pragma warn +xxx (To show the warning) 
#pragma warn -xxx (To hide the warning) 
#pragma warn .xxx (To toggle between hide and show)

要使用的三个字符代码是rvl(返回值)、par(参数是否使用)和rch(代码是否无法到达)。

如果任何字符代码以“+”为前缀,则表示显示警告;以“–”为前缀表示指示编译器隐藏警告;以点(.)为前缀表示指示编译器在隐藏和显示警告之间切换。

示例

以下示例显示了如何在 C 程序中使用 warn pragma:

#include <stdio.h>

#pragma warn -rvl          /* return value */
#pragma warn +par	   /* parameter never used */
#pragma warn –rch	   /* unreachable code */

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 pragma 来阻止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

此 pragma 允许您检查当前文件和其他文件的相对日期。如果其他文件比当前文件更新,则会发出警告。

示例

请查看以下示例:

#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。

语法

#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();	// Using a function from the library.h

   printf("Hello, World!\n");
   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!\n");
   return 0;
}
广告