亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

外排的問題

外排的問題

C++
慕田峪9158850 2019-10-13 12:08:26
外排的問題我理解“內聯”本身就是對編譯器的一種建議,在它的設計過程中,它可能會或可能不會內聯這個函數,它還會生成可鏈接的對象代碼。我認為“靜態內聯”也是如此(可能是內聯,也可能不是內聯),但是在內聯時不會生成可鏈接的對象代碼(因為沒有其他模塊可以鏈接到它)。“內插”在圖片中的位置是什么?假設我想用內聯函數替換預處理器宏,并要求這個函數內聯(例如,它使用_file_和_line_宏,應該為調用方解析,而不是這個被調用的函數)。也就是說,如果函數沒有內聯,我希望看到編譯器或鏈接器錯誤。“extern inline”會這樣做嗎?(我假設,如果沒有,除了堅持宏之外,沒有其他方法可以實現這種行為。)C+和C之間有什么區別嗎?不同的編譯器供應商和版本之間有區別嗎?
查看完整描述

3 回答

?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

在K&R C或C 89中,內聯不是語言的一部分。許多編譯器將其實現為擴展,但對于它的工作方式卻沒有定義的語義。GCC是最早實施內聯的國家之一,并介紹了inlinestatic inline,和extern inline構造;大多數預C99編譯器通常遵循它的要求。

GNU89:

  • inline

    :函數可能是內聯的(不過只是個提示)。一個線外的版本總是被發出和外部可見。因此,您只能在一個編譯單元中定義這樣一個內聯,而其他每一個編譯單元都需要將其視為一個離線函數(否則在鏈接時會得到重復的符號)。
  • extern inline

    不會生成出線版本,但可能會調用一個版本(因此,您必須在其他編譯單元中定義該版本)。不過,單定義規則是適用的;出線版本必須具有與此處提供的內聯代碼相同的代碼,以防編譯器調用該代碼。
  • static inline

    將不會生成一個外部可見的出線版本,盡管它可能會生成一個文件靜態版本?!耙粋€定義”規則不適用,因為從來沒有發出外部符號,也沒有對外部符號的調用。

C99(或GNU99):

  • inline

    *與GNU89一樣“內聯外掛”;沒有發出外部可見函數,但可能會調用一個函數,因此必須存在
  • extern inline

    類似于GNU89“內聯”:發出外部可見代碼,因此最多一個翻譯單元可以使用此代碼。
  • static inline

    *像GNU89“靜態內聯”。這是gnu 89和c99之間唯一的便攜式

C+:

任何地方內聯的函數都必須在任何地方內聯,定義相同。編譯器/鏈接器將排序符號的多個實例。沒有定義static inlineextern inline,盡管許多編譯器都有它們(通常遵循gnu 89模型)。



查看完整回答
反對 回復 2019-10-14
?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

我相信你誤解了_和_基于以下陳述:

因為它使用_file_和_line_宏,應該為調用方解析,而不是這個被調用的函數。

編譯有幾個階段,第一個階段是預處理。_因此,當編譯器可以考慮內聯函數時,它們已經被替換了。



查看完整回答
反對 回復 2019-10-14
  • 3 回答
  • 0 關注
  • 343 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號