Cprogramming 简明教程

==

What is

preprocessor 指令 #pragma 用于在 C/C++ 语言中向编译器提供附加信息。编译器使用该信息提供一些特殊功能。

请注意 pragmas are compiler dependent 。并非所有 pragma 指令都受所有编译器支持。

Syntax

以下是 C/C++ 语言中使用 #pragma 指令的 syntax

#pragma token_name

Types of Pragma Directives in C

下表列出了 C/C++ 语言中一些 #pragma 指令,

Directive

Description

#pragma startup

在 main() 执行之前,需要运行 pragma 中指定的功能。

#pragma exit

在程序结束之前,需要运行 pragma 中指定的功能。

#pragma warn

用于隐藏警告信息。

#pragma GCC dependency

检查当前文件和另一个文件的时间。如果另一个文件较新,则显示警告信息。

#pragma GCC system_header

它将当前文件中的代码视为来自系统标头。

#pragma GCC poison

用于从程序中阻止一个标识符。

#pragma once

编译器仅加载一次头文件。

===

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

Example

以下代码演示了如何使用 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 指令用于隐藏或显示编译时显示的警告信息。

warn pragma 按照以下 syntax 使用−

#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 (如果代码不可达)。

如果字符代码之前带有“+”,表示显示警告;如果之前带有“–”,表示向编译器提出隐藏警告的指示;如果之前带有句点 (.),则为对编译器提出的在隐藏和显示警告之间切换的指令。

Example

以下示例显示了如何在 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

===

GCC 编译器从程序中完全删除 identifier 。如果要阻止标识符,则可以使用 #pragma GCC poison 指令。其语法如下 −

#pragma GCC poison identifier

Example

在此示例中,我们将使用 GCC poison pragma 来阻止 printf() function

#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 允许您检查当前文件和另一个文件的相对日期。如果另一个文件比当前文件新,则会发出警告。

Example

请看以下示例:

#include <stdio.h>

#pragma GCC dependency "depends.c"

int main(){

   printf("Hello, World!");
   return 0;
}

上面的源代码依赖于 depends.c。如果其编译时间戳较新,则会发出以下 warning

warning: current file is older than depends.c

===

按照惯例,系统头文件在 #include directive 前面放置尖括号,而非系统头文件则用引号括起。如果您希望编译器将后者视为系统头文件,请使用此 pragma。

Syntax

#pragma GCC system_header

library.h

我们在当前目录中定义了一个“library.h”头文件。

#ifndef LIBRARY_H
#define LIBRARY_H

#pragma GCC system_header

void myFunction();

#endif

Example

要让编译器将“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 指令会导致头文件仅包含一次,即使程序员多次包含它。

将“myheader.h”文件另存为 −

myheader.h

#pragma once
void myFunction();

Example

在另一个代码 (main.c) 中,按如下方式调用 myFunction() −

#include <stdio.h>
#include "myheader.h"

int main(){

   myFunction();
   printf("Hello, World!\n");
   return 0;
}