99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

STM32嵌入式開發(fā) ? 來(lái)源:csdn ? 2024-04-19 11:50 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 #pragma once有什么作用?

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

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

示例代碼如下:


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


//方式二:
#pragma once
 ... ... // 聲明、定義語(yǔ)句
3 兩者各有何特點(diǎn)

(1)#ifndef

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

(2)#pragma once

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

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

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


#pragma once
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__


... ... // 聲明、定義語(yǔ)句


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

#ifndef方式

#pragma once方式

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


方式一:

#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些聲明語(yǔ)句
#endif


方式二:


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

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

    關(guān)注

    180

    文章

    7632

    瀏覽量

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

    關(guān)注

    22

    文章

    2119

    瀏覽量

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

    關(guān)注

    1

    文章

    1662

    瀏覽量

    50230

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

    兩種方式實(shí)現(xiàn)C語(yǔ)言訪問(wèn)MCU寄存器

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

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

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

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

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

    SQL語(yǔ)句的兩種嵌套方式

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

    SQL語(yǔ)言的兩種使用方式

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

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

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

    C/C++ 詳解

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

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

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

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

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

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

    首先C++C語(yǔ)言本來(lái)就是兩種不同的編程語(yǔ)言,但C++確實(shí)是對(duì)C語(yǔ)言的擴(kuò)充和延伸,并且對(duì)C語(yǔ)言提
    的頭像 發(fā)表于 06-20 11:28 ?5769次閱讀

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

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

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

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

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

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

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

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