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

© . All rights reserved.