最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言中#pragma的用法及使用解讀

 更新時(shí)間:2025年10月14日 09:29:12   作者:帥氣小胖子  
這篇文章主要介紹了C語(yǔ)言中#pragma的用法及使用解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、比較矛盾的點(diǎn)-#pragma到底算不算關(guān)鍵字

有人認(rèn)為是算,而有人則認(rèn)為不算。

先看反對(duì)派,反對(duì)派認(rèn)為#pragma不算是C關(guān)鍵字的原因也很簡(jiǎn)單,即神并沒(méi)有認(rèn)可,那神是什么喃?即我們熟知的C89,C99,C11等協(xié)議。并沒(méi)有規(guī)定或者定義#pragma。

認(rèn)同派則認(rèn)為反對(duì)派過(guò)于迂腐,#pragma是個(gè)老伙伴了,它為c語(yǔ)言立過(guò)工,它為C語(yǔ)言流過(guò)血,就因?yàn)閰f(xié)議中沒(méi)有規(guī)定,就認(rèn)為他不是關(guān)鍵字,這樣很不好

二、閑話少說(shuō),看#pragma具體用法

pragma具體是指編譯器使用的,即這是編譯器能夠識(shí)別的和其他類型的#指令是一致的。我們最常見(jiàn)的#include和#define和undefine是一樣的。

2.1.#pragma的作用

#pragma 是 C/C++ 預(yù)處理指令之一,用來(lái)向編譯器傳遞一些平臺(tái)相關(guān)的編譯控制信息。

它的特點(diǎn)是:

  • 編譯器相關(guān):不同編譯器支持的 #pragma 指令不同
  • 功能多樣:可以控制編譯器的警告、優(yōu)化、對(duì)齊方式、鏈接等

語(yǔ)法格式

#pragma 指令名 [參數(shù)]

2.2. 常用的#pragma示例

(1)#pragma once—— 防止頭文件重復(fù)包含

#pragma once
  • 作用:保證頭文件只被編譯一次
  • 優(yōu)點(diǎn):比傳統(tǒng)的 #ifndef / #define / #endif 更高效
  • 缺點(diǎn):不是 C 標(biāo)準(zhǔn),但是大多數(shù)現(xiàn)代編譯器(GCC、Clang、MSVC)都支持

(2)#pragma pack—— 控制結(jié)構(gòu)體成員對(duì)齊方式

#pragma pack(push, 1)  // 按1字節(jié)對(duì)齊,并保存當(dāng)前對(duì)齊狀態(tài)
struct Data {
    char a;
    int  b;
    short c;
};
#pragma pack(pop)      // 恢復(fù)之前的對(duì)齊狀態(tài)
  • 用途:在網(wǎng)絡(luò)協(xié)議、文件格式、硬件驅(qū)動(dòng)等需要精確定義內(nèi)存布局的場(chǎng)景
  • #pragma pack(n) 表示按 n 字節(jié)對(duì)齊(n 取 1、2、4、8 等)主要參數(shù)有push和pop和對(duì)齊的數(shù)字

(3)#pragma message—— 編譯時(shí)輸出提示信息

c運(yùn)行,這個(gè)就很簡(jiǎn)單,如果我們可以在代碼中的任何地方添加,這樣我們就能知道編譯到什么地方了

#pragma message("正在編譯 main.c...")
  • 作用:在編譯過(guò)程中輸出自定義提示信息
  • 常用于條件編譯檢查

(4)#pragma warning—— 控制編譯器警告

MSVC 編譯器

#pragma warning(disable: 4996)  // 禁用 4996 號(hào)警告
#pragma warning(once: 4820)     // 僅顯示一次 4820 號(hào)警告
#pragma warning(error: 164)     // 將 164 號(hào)警告視為錯(cuò)誤

GCC/Clang 一般用 -W、-Werror 等命令行參數(shù),不常用 #pragma warning

(5)#pragma comment—— 鏈接時(shí)加入庫(kù)或其他信息(MSVC)

#pragma comment(lib, "ws2_32.lib")  // 鏈接 Winsock 庫(kù)
#pragma comment(linker, "/subsystem:windows") // 設(shè)置子系統(tǒng)類型
  • 僅在 Windows + MSVC 環(huán)境有效

(6)#pragma GCC diagnostic—— GCC 特定的警告控制

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
    int x; // 不會(huì)產(chǎn)生未使用變量警告
#pragma GCC diagnostic pop
  • 作用:臨時(shí)禁用 / 開(kāi)啟某些 GCC 警告

2.3. 注意事項(xiàng)

  • 可移植性差#pragma 是編譯器擴(kuò)展,不同編譯器支持的指令不同。例如 #pragma once 在 GCC/Clang/MSVC 可用,但在某些老編譯器可能不支持。
  • 標(biāo)準(zhǔn)中未定義的 #pragma如果編譯器遇到不認(rèn)識(shí)的 #pragma,會(huì)忽略該指令,不會(huì)報(bào)錯(cuò)。
  • 盡量使用標(biāo)準(zhǔn)方法如果有標(biāo)準(zhǔn)方法(如 #ifndef 代替 #pragma once),優(yōu)先使用標(biāo)準(zhǔn)方法,提高可移植性。

總結(jié)

#pragma 示例作用常見(jiàn)編譯器支持
#pragma once防止頭文件重復(fù)包含GCC, Clang, MSVC
#pragma pack控制結(jié)構(gòu)體對(duì)齊大多數(shù)編譯器
#pragma message編譯時(shí)輸出信息大多數(shù)編譯器
#pragma warning控制警告MSVC
#pragma comment鏈接設(shè)置MSVC
#pragma GCC diagnostic控制 GCC 警告GCC, Clang

? 結(jié)論:

  • #pragma 是 C 語(yǔ)言中一個(gè)強(qiáng)大但平臺(tái)相關(guān)的預(yù)處理指令,可以用來(lái)控制編譯器行為、優(yōu)化、警告、對(duì)齊等。
  • 使用時(shí)要注意可移植性,優(yōu)先考慮標(biāo)準(zhǔn)方法,只在必要時(shí)使用特定編譯器的 #pragma 擴(kuò)展。

三、一份不同編譯器支持的常用 #pragma 指令對(duì)照表

這樣在跨平臺(tái)開(kāi)發(fā)時(shí)就能清楚哪些可用哪些不可用。

功能MSVCGCC / ClangKeil (ARMCC)IAR說(shuō)明
防止頭文件重復(fù)包含#pragma once#pragma once#pragma once#pragma once非標(biāo)準(zhǔn),但現(xiàn)代編譯器普遍支持;標(biāo)準(zhǔn)做法是 #ifndef/#define/#endif
結(jié)構(gòu)體 / 聯(lián)合對(duì)齊

#pragma pack(push, n)

#pragma pack(pop)

#pragma pack(push, n)

#pragma pack(pop)

#pragma pack(push, n)

#pragma pack(pop)

#pragma pack(push, n)

#pragma pack(pop)

設(shè)置結(jié)構(gòu)體成員對(duì)齊為 n 字節(jié);n 可取 1/2/4/8/16
編譯時(shí)消息輸出#pragma message("text")#pragma message "text"#pragma message("text")#pragma message="text"在編譯輸出中顯示提示信息
禁用 / 開(kāi)啟警告

#pragma warning(disable: 1234)

#pragma warning(default: 1234)

#pragma GCC diagnostic ignored "-Wxxx"#pragma diag_suppress 1234#pragma diag_suppress=Pe123臨時(shí)關(guān)閉 / 恢復(fù)特定警告
警告視為錯(cuò)誤#pragma warning(error: 1234)#pragma GCC diagnostic error "-Wxxx"#pragma diag_error 1234#pragma diag_error=Pe123將指定警告當(dāng)作錯(cuò)誤處理
鏈接選項(xiàng)#pragma comment(lib, "libname.lib")#pragma comment(linker, "/option")無(wú)(用 -l/-Wl,option)無(wú)(用 --library/ scatter file)無(wú)(用鏈接器選項(xiàng))向鏈接器傳遞參數(shù)或添加庫(kù)
代碼段 / 節(jié)區(qū)控制#pragma section("name")__declspec(allocate("name"))__attribute__((section("name")))__attribute__((section("name")))#pragma location="name"將變量 / 函數(shù)放入指定段
優(yōu)化控制#pragma optimize("", off)#pragma optimize("", on)#pragma GCC push_options#pragma GCC optimize("O0")#pragma GCC pop_options#pragma optimize=none#pragma optimize=none局部關(guān)閉 / 開(kāi)啟優(yōu)化
循環(huán)優(yōu)化#pragma loop(hint_parallel(n))#pragma GCC ivdep無(wú)無(wú)提示編譯器并行 / 向量化優(yōu)化
對(duì)齊控制__declspec(align(n))__attribute__((aligned(n)))__attribute__((aligned(n)))__attribute__((aligned(n)))指定變量 / 類型對(duì)齊
內(nèi)聯(lián)控制__forceinline__declspec(noinline)__attribute__((always_inline))__attribute__((noinline))同上同上強(qiáng)制內(nèi)聯(lián) / 禁止內(nèi)聯(lián)
中斷函數(shù)__declspec(naked)無(wú)(用 __attribute__((naked)))__attribute__((naked))#pragma interrupt定義無(wú)棧幀 / 特殊中斷函數(shù)

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++采用ring3讀取MBR實(shí)例

    C++采用ring3讀取MBR實(shí)例

    這篇文章主要介紹了C++采用ring3讀取MBR實(shí)例,可實(shí)現(xiàn)對(duì)硬盤的主引導(dǎo)記錄的讀取,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C++類中如何使用定義的類型別名

    C++類中如何使用定義的類型別名

    這篇文章主要介紹了C++類中如何使用定義的類型別名,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++中的volatile關(guān)鍵字及其作用

    C++中的volatile關(guān)鍵字及其作用

    本文介紹了C++中的volatile關(guān)鍵字,它用于標(biāo)識(shí)變量可能被意外修改,以及編譯器不應(yīng)進(jìn)行優(yōu)化。本文通過(guò)具體的代碼示例,闡述了volatile關(guān)鍵字的作用和使用方法,幫助讀者更好地了解該關(guān)鍵字在C++語(yǔ)言中的應(yīng)用場(chǎng)景和實(shí)現(xiàn)原理
    2023-04-04
  • C語(yǔ)言線性表順序表示及實(shí)現(xiàn)

    C語(yǔ)言線性表順序表示及實(shí)現(xiàn)

    這篇文章主要介紹了C語(yǔ)言線性表順序表示及實(shí)現(xiàn),線性表是最常用且最簡(jiǎn)單的一種數(shù)據(jù)結(jié)構(gòu)。簡(jiǎn)而言之,一個(gè)線性表是n個(gè)數(shù)據(jù)元素的有限序列
    2022-07-07
  • C語(yǔ)言運(yùn)算符的優(yōu)先級(jí)和結(jié)合性實(shí)例詳解

    C語(yǔ)言運(yùn)算符的優(yōu)先級(jí)和結(jié)合性實(shí)例詳解

    本文主要介紹C語(yǔ)言運(yùn)算符的知識(shí),這里對(duì)運(yùn)算符的優(yōu)先級(jí)和結(jié)合性做出了詳解,并附實(shí)例代碼,希望能幫助有需要的小伙伴
    2016-07-07
  • C語(yǔ)言中auto,register,static,const,volatile的區(qū)別詳細(xì)解析

    C語(yǔ)言中auto,register,static,const,volatile的區(qū)別詳細(xì)解析

    以下是對(duì)C語(yǔ)言中auto,register,static,const,volatile的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • C語(yǔ)言中數(shù)組常用的一些排序算法小結(jié)

    C語(yǔ)言中數(shù)組常用的一些排序算法小結(jié)

    數(shù)組的排序方法有很多,效率也各不相同,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中數(shù)組常用的一些排序算法的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)希爾排序算法

    C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)希爾排序算法

    這篇文章主要為大家介紹了C語(yǔ)言希爾排序算法實(shí)現(xiàn)植物大戰(zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C語(yǔ)言實(shí)現(xiàn)字符串拼接和拷貝

    C語(yǔ)言實(shí)現(xiàn)字符串拼接和拷貝

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)字符串拼接和拷貝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • EasyC++編寫(xiě)頭文件

    EasyC++編寫(xiě)頭文件

    這篇文章主要介紹了C++編寫(xiě)頭文件,在一個(gè)C++程序中,只包含兩類文件——.cpp文件和.h文件。其中,.cpp文件被稱作C++源文件,里面放的都是C++的源代碼;而.h文件則被稱作C++頭文件,里面放的也是C++的源代碼,感興趣的小伙伴一起來(lái)看下面文章的詳細(xì)介紹吧
    2021-12-12

最新評(píng)論

盘山县| 弋阳县| 镇沅| 黔江区| 定襄县| 兴文县| 沂水县| 奉新县| 富宁县| 鸡泽县| 象山县| 会昌县| 隆安县| 北票市| 安义县| 治县。| 黎城县| 天台县| 衡阳县| 西吉县| 东光县| 探索| 岳普湖县| 桦南县| 伊金霍洛旗| 乌恰县| 景洪市| 新丰县| 石嘴山市| 河池市| 唐河县| 通渭县| 阳东县| 庄浪县| 洛宁县| 永济市| 边坝县| 文登市| 柯坪县| 沙洋县| 高雄县|