- 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;
}