Cprogramming 简明教程
==
What is
preprocessor 指令 #pragma 用于在 C/C++ 语言中向编译器提供附加信息。编译器使用该信息提供一些特殊功能。
请注意 pragmas are compiler dependent 。并非所有 pragma 指令都受所有编译器支持。
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。
library.h
我们在当前目录中定义了一个“library.h”头文件。
#ifndef LIBRARY_H
#define LIBRARY_H
#pragma GCC system_header
void myFunction();
#endif