0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C/C++中兩種宏實現(xiàn)方式

STM32嵌入式開發(fā) ? 來源:csdn ? 2024-04-19 11:50 ? 次閱讀

1 #pragma once有什么作用?

為了避免同一個頭文件被包含(include)多次,C/C++中有兩種宏實現(xiàn)方式: 一種是#ifndef方式; 另一種是#pragma once方式。 在能夠支持這兩種方式的編譯器上,二者并沒有太大的區(qū)別。但兩者仍然有一些細(xì)微的區(qū)別。

2 兩者的使用方式有何區(qū)別

示例代碼如下:


//方式一:
#ifndef  __SOMEFILE_H__
#define   __SOMEFILE_H__
 ... ... // 聲明、定義語句
#endif


//方式二:
#pragma once
 ... ... // 聲明、定義語句
3 兩者各有何特點

(1)#ifndef

#ifndef的方式受C/C++語言標(biāo)準(zhǔn)支持。它不僅可以保證同一個文件不會被包含多次,也能保證內(nèi)容完全相同的兩個文件(或者代碼片段)不會被不小心同時包含。 當(dāng)然,缺點就是如果不同頭文件中的宏名不小心“撞車”,可能就會導(dǎo)致你看到頭文件明明存在,但編譯器卻硬說找不到聲明的狀況——這種情況有時非常讓人郁悶。 由于編譯器每次都需要打開頭文件才能判定是否有重復(fù)定義,因此在編譯大型項目時,ifndef會使得編譯時間相對較長,因此一些編譯器逐漸開始支持#pragma once的方式。

(2)#pragma once

#pragma once 一般由編譯器提供保證:同一個文件不會被包含多次。注意這里所說的“同一個文件”是指物理上的一個文件,而不是指內(nèi)容相同的兩個文件。 你無法對一個頭文件中的一段代碼作pragma once聲明,而只能針對文件。 其好處是,你不必再擔(dān)心宏名沖突了,當(dāng)然也就不會出現(xiàn)宏名沖突引發(fā)的奇怪問題。大型項目的編譯速度也因此提高了一些。 對應(yīng)的缺點就是如果某個頭文件有多份拷貝,本方法不能保證他們不被重復(fù)包含。當(dāng)然,相比宏名沖突引發(fā)的“找不到聲明”的問題,這種重復(fù)包含很容易被發(fā)現(xiàn)并修正。 另外,這種方式不支持跨平臺!

4 兩者之間有什么聯(lián)系?

#pragma once 方式產(chǎn)生于#ifndef之后,因此很多人可能甚至沒有聽說過。目前看來#ifndef更受到推崇。 因為#ifndef受C/C++語言標(biāo)準(zhǔn)的支持,不受編譯器的任何限制; 而#pragma once方式卻不受一些較老版本的編譯器支持,一些支持了的編譯器又打算去掉它,所以它的兼容性可能不夠好。 一般而言,當(dāng)程序員聽到這樣的話,都會選擇#ifndef方式,為了努力使得自己的代碼“存活”時間更久,通常寧愿降低一些編譯性能,這是程序員的個性,當(dāng)然這是題外話啦。 還看到一種用法是把兩者放在一起的


#pragma once
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__


... ... // 聲明、定義語句


#endif
總結(jié): 看起來似乎是想兼有兩者的優(yōu)點。 不過只要使用了#ifndef就會有宏名沖突的危險,也無法避免不支持#pragma once的編譯器報錯,所以混用兩種方法似乎不能帶來更多的好處,倒是會讓一些不熟悉的人感到困惑。 選擇哪種方式,應(yīng)該在了解兩種方式的情況下,視具體情況而定。 只要有一個合理的約定來避開缺點,我認(rèn)為哪種方式都是可以接受的。 而這個已經(jīng)不是標(biāo)準(zhǔn)或者編譯器的責(zé)任了,應(yīng)當(dāng)由程序員自己或者小范圍內(nèi)的開發(fā)規(guī)范來搞定。 為了避免同一個文件被include多次:

#ifndef方式

#pragma once方式

在能夠支持這兩種方式的編譯器上,二者并沒有太大的區(qū)別,但是兩者仍然還是有一些細(xì)微的區(qū)別。


方式一:

#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些聲明語句
#endif


方式二:


#pragma once
... ... // 一些聲明語句
#ifndef的方式依賴于宏名字不能沖突,這不光可以保證同一個文件不會被包含多次,也能保證內(nèi)容完全相同的兩個文件不會被不小心同時包含。 當(dāng)然,缺點就是如果不同頭文件的宏名不小心“撞車”,可能就會導(dǎo)致頭文件明明存在,編譯器卻硬說找不到聲明的狀況。 #pragma once則由編譯器提供保證:同一個文件不會被包含多次。 注意這里所說的“同一個文件”是指物理上的一個文件,而不是指內(nèi)容相同的兩個文件。帶來的好處是,你不必再費勁想個宏名了,當(dāng)然也就不會出現(xiàn)宏名碰撞引發(fā)的奇怪問題。 對應(yīng)的缺點就是如果某個頭文件有多份拷貝,本方法不能保證他們不被重復(fù)包含。 當(dāng)然,相比宏名碰撞引發(fā)的“找不到聲明”的問題,重復(fù)包含更容易被發(fā)現(xiàn)并修正。 方式一 由語言支持所以移植性好, 方式二 可以避免名字沖突。
審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136824
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2108

    瀏覽量

    73651
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1634

    瀏覽量

    49132

原文標(biāo)題:C語言#pragma once的用法

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C語言實現(xiàn)面向?qū)ο蟮?b class='flag-5'>方式 C++的class的運行原理

    這里主要介紹下在C語言中是如何實現(xiàn)的面向?qū)ο?。知道?b class='flag-5'>C語言實現(xiàn)面向?qū)ο蟮?b class='flag-5'>方式,再聯(lián)想下,C++
    發(fā)表于 10-21 09:00 ?1137次閱讀

    兩種方式實現(xiàn)C語言訪問MCU寄存器

    來源 網(wǎng)絡(luò)單片機的特殊功能寄存器SFR,是SRAM地址已經(jīng)確定的SRAM單元,在C語言環(huán)境下對其訪問歸納起來有兩種方法。 1、采用標(biāo)準(zhǔn)C的強制類型轉(zhuǎn)換和指針來實現(xiàn) 采用標(biāo)準(zhǔn)
    發(fā)表于 04-19 14:45

    如何實現(xiàn)C語言訪問MCU寄存器?掌握這兩種方式就夠了!

    單片機的特殊功能寄存器SFR,是SRAM地址已經(jīng)確定的SRAM單元,在C語言環(huán)境下對其訪問歸納起來有兩種方法。1、采用標(biāo)準(zhǔn)C的強制類型轉(zhuǎn)換和指針來實現(xiàn)采用標(biāo)準(zhǔn)
    發(fā)表于 03-08 09:42

    SQL語句的兩種嵌套方式

    一般情況下,SQL語句是嵌套在宿主語言(如C語言)的。有兩種嵌套方式:1.調(diào)用層接口(CLI):提供一些庫,庫的函數(shù)和方法
    發(fā)表于 05-23 08:51

    SQL語言的兩種使用方式

    SQL語言的兩種使用方式在終端交互方式下使用,稱為交互式SQL嵌入在高級語言的程序中使用,稱為嵌入式SQL―高級語言如C、Java等,稱為宿主語言嵌入式SQL的
    發(fā)表于 12-20 06:51

    淺談關(guān)于DSP6000C/C++語言和匯編語言的混合編程的方法

    一、混合編程的方法主要有以下幾種: (1)獨立編寫C語言程序和匯編程序,分別編譯形成各自的目標(biāo)代碼塊, 然后用連接器將兩種模塊連接起來。 (2)直接在C/C++程序
    發(fā)表于 10-24 10:10 ?1次下載

    C/C++ 詳解

    眾多C++書籍都忠告我們C語言是萬惡之首,但事情總不如我們想象的那么壞,就如同goto一樣。有一個很大的作用,就是自動為我們產(chǎn)生代碼。如果說模板 眾多
    發(fā)表于 09-21 12:55 ?1616次閱讀

    使用51單片機C語言和匯編兩種方式實現(xiàn)設(shè)計時鐘的程序免費下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用51單片機C語言和匯編兩種方式實現(xiàn)設(shè)計時鐘的程序免費下載。
    發(fā)表于 06-18 17:44 ?4次下載
    使用51單片機<b class='flag-5'>C</b>語言和匯編<b class='flag-5'>兩種</b><b class='flag-5'>方式</b><b class='flag-5'>實現(xiàn)</b>設(shè)計時鐘的程序免費下載

    EE-112:模擬C++的類實現(xiàn)

    EE-112:模擬C++的類實現(xiàn)
    發(fā)表于 05-27 16:13 ?2次下載
    EE-112:模擬<b class='flag-5'>C++</b><b class='flag-5'>中</b>的類<b class='flag-5'>實現(xiàn)</b>

    虛擬機的設(shè)計與實現(xiàn):C\C++

    虛擬機的設(shè)計與實現(xiàn):C\C++
    發(fā)表于 02-21 15:10 ?0次下載

    C語言和C++到底是什么關(guān)系

    首先C++C語言本來就是兩種不同的編程語言,但C++確實是對C語言的擴充和延伸,并且對C語言提
    的頭像 發(fā)表于 06-20 11:28 ?4970次閱讀

    在MATLAB/simulink建模時的兩種不同實現(xiàn)方式

    導(dǎo)讀:本期文章主要介紹在MATLAB/simulink建模時的兩種不同實現(xiàn)方式,一是直接用現(xiàn)成的文件庫
    的頭像 發(fā)表于 09-15 10:07 ?1890次閱讀

    MATLAB/simulink兩種實現(xiàn)建模方式的優(yōu)勢

    導(dǎo)讀:本期文章主要介紹在MATLAB/simulink建模時的兩種不同實現(xiàn)方式,一是直接用現(xiàn)成的文件庫
    的頭像 發(fā)表于 09-15 10:10 ?5052次閱讀

    如何選擇創(chuàng)建c語言和c++

    選擇創(chuàng)建 C 語言和 C++ 都需要綜合考慮多個因素。在決定使用哪種語言之前,我們需要對這兩種語言的特點、優(yōu)缺點、適用場景、學(xué)習(xí)成本等進(jìn)行全面的了解和對比。下面是關(guān)于選擇創(chuàng)建 C 語言
    的頭像 發(fā)表于 11-27 15:58 ?610次閱讀

    C++實現(xiàn)類似instanceof的方法

    函數(shù),可實際上C++沒有。但是別著急,其實C++中有兩種簡單的方法可以實現(xiàn)類似Java的in
    的頭像 發(fā)表于 07-18 10:16 ?586次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>中</b><b class='flag-5'>實現(xiàn)</b>類似instanceof的方法