- C 编程教程
- C - 首页
- C语言基础
- C - 概述
- C - 特性
- C - 历史
- C - 环境搭建
- C - 程序结构
- C - Hello World
- C - 编译过程
- C - 注释
- C - 词法单元
- C - 关键字
- C - 标识符
- C - 用户输入
- C - 基本语法
- C - 数据类型
- C - 变量
- C - 整数提升
- C - 类型转换
- C - 类型强制转换
- C - 布尔类型
- C语言中的常量和字面量
- C - 常量
- C - 字面量
- C - 转义序列
- C - 格式说明符
- C语言中的运算符
- C - 运算符
- C - 算术运算符
- C - 关系运算符
- C - 逻辑运算符
- C - 位运算符
- C - 赋值运算符
- C - 一元运算符
- C - 自增和自减运算符
- C - 三元运算符
- C - sizeof 运算符
- C - 运算符优先级
- C - 其他运算符
- C语言中的决策
- C - 决策
- C - if 语句
- C - if...else 语句
- C - 嵌套 if 语句
- C - switch 语句
- C - 嵌套 switch 语句
- C语言中的循环
- C - 循环
- C - while 循环
- C - for 循环
- C - do...while 循环
- C - 嵌套循环
- C - 无限循环
- C - break 语句
- C - continue 语句
- C - goto 语句
- C语言中的函数
- C - 函数
- C - 主函数
- C - 按值调用函数
- C - 按引用调用函数
- C - 嵌套函数
- C - 可变参数函数
- C - 用户自定义函数
- C - 回调函数
- C - return 语句
- C - 递归
- C语言中的作用域规则
- C - 作用域规则
- C - 静态变量
- C - 全局变量
- C语言中的数组
- C - 数组
- C - 数组的特性
- C - 多维数组
- C - 向函数传递数组
- C - 从函数返回数组
- C - 可变长数组
- C语言中的指针
- C - 指针
- C - 指针和数组
- C - 指针的应用
- C - 指针运算
- C - 指针数组
- C - 指针到指针
- C - 向函数传递指针
- C - 从函数返回指针
- C - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - void 指针
- C - 野指针
- C - 解引用指针
- C - 近、远和巨型指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点(.)运算符
- C - 枚举(或 enum)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - typedef
- C语言中的文件处理
- C - 输入与输出
- C - 文件I/O(文件处理)
- C 预处理器
- C - 预处理器
- C - Pragmas
- C - 预处理器运算符
- C - 宏
- C - 头文件
- C语言中的内存管理
- C - 内存管理
- C - 内存地址
- C - 存储类别
- 其他主题
- C - 错误处理
- C - 可变参数
- C - 命令执行
- C - 数学函数
- C - static 关键字
- C - 随机数生成
- C - 命令行参数
- C编程资源
- C - 问题与解答
- C - 快速指南
- C - 速查表
- C - 有用资源
- C - 讨论
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; }