inline函式必須在標頭檔案中定義嗎?
前不久在寫程式碼的時候遇到一個link錯誤,程式碼的原型如下所示,基本就是定義了一個基類和派生類,在派生類的一個成員函式中用到了基類定義的一個行內函數。
- // base.h
- class Base
- {
- protected:
- void fun();
- };
- // base.cpp
- #include "base.h"
- inlinevoid Base::fun()
- {}
- // derived.h
- #include "base.h"
- class Derived: public Base
- {
- public:
- void g();
- };
- // derived.cpp
- void Derived::g()
- {
- fun(); //VC2008: error LNK2019: unresolved external symbol
- }
// base.h class Base { protected: void fun(); }; // base.cpp #include "base.h" inline void Base::fun() {} // derived.h #include "base.h" class Derived: public Base { public: void g(); }; // derived.cpp void Derived::g() { fun(); //VC2008: error LNK2019: unresolved external symbol }
寫這個行內函數的時候也沒細想,結果違反了inline函式的要求。所謂行內函數,就是編譯器將函式定義({...}之間的內容)在函式呼叫處展開,藉此來免去函式呼叫的開銷。如果這個函式定義在標頭檔案中,所有include該標頭檔案的編譯單元都可以正確找到函式定義。然而,如果行內函數fun()定義在某個編譯單元A中,那麼其他編譯單元中呼叫fun()的地方將無法解析該符號,因為在編譯單元A生成目標檔案A.obj後,行內函數fun()已經被替換掉,A.obj中不再有fun這個符號,連結器自然無法解析。
所以,如果一個inline函式會在多個原始檔中被用到,那麼必須把它定義在標頭檔案中。在C++中,這意味著
相關推薦
inline函式必須在標頭檔案中定義嗎?
前不久在寫程式碼的時候遇到一個link錯誤,程式碼的原型如下所示,基本就是定義了一個基類和派生類,在派生類的一個成員函式中用到了基類定義的一個行內函數。 [cpp] view plaincopyprint? // base.hclass Base { protected: void
為什麼inline函式應該在標頭檔案中定義?【轉】
(轉自:https://blog.csdn.net/ronnie_hu/article/details/62238311) inline函式(即行內函數)對編譯器而言必須是可見的,以便能夠在呼叫點展開該函式,與非inline函式不同的是,inline函式必須在呼叫該函式的每個檔案中定義。當然,對
為什麼inline函式應該在標頭檔案中定義?
inline函式(即行內函數)對編譯器而言必須是可見的,以便能夠在呼叫點展開該函式,與非inline函式不同的是,inline函式必須在呼叫該函式的每個檔案中定義。當然,對於同一程式的不同檔案,如果inline函數出現的話,其定義必須相同。 正因為如此,建議把
codeblock無法編譯,提示函式沒有定義,但是函式已經 在標頭檔案中定義了
你在新增檔案時沒有選中Targets。預設情況下,一個工程會有兩個Targets,一個叫Debug,一個叫Release,前者可以除錯,用於開發。後者不能除錯,用於生成最終釋出的軟體。CodeBloc
函式放在標頭檔案中被多次包含的重定義問題
Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 轉載請標明來源 例如一個頭檔案headfile.h這樣寫 #pragma once bool Func (){return true;} 在這個標頭檔案被多個地方包含的時候就會出
全域性變數在標頭檔案中“定義”
看著標題,定義上面加了一個引號,這個得注意了。怎麼解釋呢,一般而言,變數只能定義在.c檔案中,宣告變數才在.h檔案中。下面就打破常規,把定義變數的語句放在.h檔案中,但是對實際而言,變數定義在標頭檔案中是表面上的。 下面直接給出程式碼,有三個
c++在標頭檔案中定義全域性變數時需要注意的地方
我們知道,在 C++(但不是在 C 語言)中,const 限定符對預設儲存型別稍有影響。在預設情況下,全域性變數的連結性為外部的,但 const 全域性變數的連結性為內部的。也就是說,在 C++ 看來,全域性 const 定義就像使用了 static 說明符一樣。
C/C++語言在標頭檔案中定義全域性變數
轉載:http://blog.csdn.net/chenqiai0/article/details/8490665 全域性變數可不可以定義在可被多個.C檔案包含的標頭檔案中?為什麼? 可以,在不同的C檔案中以static形式來宣告同名全域性變數。標頭檔案中不可以直接定
標頭檔案中定義static靜態變數的利弊
對於儲存位置:靜態變數的效果和全域性變數的效果是一樣的,他們都儲存在全域性資料區。頻繁使用其實效率更高,如果定義的靜態變數不用,那就會浪費記憶體,因為全域性資料區生命週期是從程式執行到結束。 區域性變數:每次棧上都要為區域性變數分配空間,因此區域性變數太多
不要在標頭檔案中定義變數
在寫C程式碼的時候,經常需要在標頭檔案中包含有些預定義的資訊。比如一些結構體的宣告,外部變數,函式的宣告等。 有時候覺得有必要在標頭檔案中定義一些變數,這樣在原始檔中就不需要定義了。但是這樣做,有很大的問題。 比如 //test.h 1 #ifndef _TEST_H
能不能在標頭檔案中定義全域性變數?
首先,這是一篇科普文,所以 比較雜,我儘量寫清楚一些。 1、ANSI C標準是什麼?GNU又是什麼?ld是什麼? ANSI C是C語言的標準規範,是國際標準化組織制定的國際標準。 雖然 ANSI C規範了C語言的實現,但是在實際情況中,各家C語言提供商都會根據平臺的不
const物件為什麼可以在標頭檔案中定義
對於標頭檔案中為什麼可以定義const變數(或物件),以及推薦用const代替#define巨集定義,之前一直概念不清晰,今天就總結一下。 之前在網上查過,解釋的都不太到位,或者角度不一樣(從編譯原理、強弱定義?),總之不能清晰理解,發現《C++ Primer》上基本上涵蓋
標頭檔案中能否進行函式的定義
通常我們使用標頭檔案時都是在標頭檔案中進行宣告,在原始檔中定義,哪我們能否在標頭檔案中進行函式的定義 我們先進行一個測試,先宣告一個test.h和一個test.cpp檔案,並且在test.h中定義一個函式和一個變數 可以發現,程式執行沒有問題,結果也正確
標頭檔案中寫類的實現出現函式重複定義的問題
先來做一個實驗,你在一個頭檔案中定義一個類,然後把內中的一個函式的實現寫在這個標頭檔案當中。 //A_test.h #ifndefine _A_TEST_ #define _A_TEST_ class A { void test(); }; void A::test() {
標頭檔案中只能宣告變數不能定義變數 而宣告變數必須帶extern,為什麼標頭檔案中變數的宣告都沒有加
1.標頭檔案中不可以放變數的定義!一般標頭檔案中只是放變數的宣告,因為標頭檔案要被其他檔案包含#include,如果把定義放在標頭檔案的話,就不能避免多次定義變數。C++不允許多次定義變數,一個程式中對指定變數的定義只有一次,宣告可以無數次。 三個例外:1)值在編譯時
標頭檔案中不能定義變數
標頭檔案中定義全域性變數會出現的問題 =====本文轉載的,在工作中,很受用,特此記錄之。====== 直接在標頭檔案中定義全域性變數,然後有多個檔案包含這個標頭檔案時,編譯通過不了,提示重複定義變數! 在標頭檔案中定義全域性變數時前面加上關鍵字static,此時編譯會通過但是此時全域性
標頭檔案中的巨集定義 標頭檔案中的巨集定義
標頭檔案中的巨集定義 程式碼: 1 #ifndef DSP_ADC_BSP_H_ //防止標頭檔案被重複包含 2 #define DSP_ADC_BSP_H_ 3 4 #ifdef _DSP_
IAR 430 標頭檔案中#define定義的部分解釋
前面的兩個#define的用法是一樣的。首先我可以發現,在巨集定義裡面都有一個關鍵字__no_init。查看了《MSP430 IAR C/EC++ Compiler Reference Guide》內的IAR Language Extension Overview 可以發現,__no_init是IAR擴充套件
關於標頭檔案中的重複包含和重複定義
為了避免重複定義,一般標頭檔案中不會存放定義,只存放函式宣告和變數的宣告。但也有例外,類、inline函式和編譯時值已知的const物件可以在標頭檔案中定義,這是因為遵守“單一定義規則”(One-Definition Rule, ODR)。根據此規則, 如果對同一個類的兩個定義完全相同且出現在不同編譯單位,
為什麼類的定義應當寫在標頭檔案中,從而被多個原始檔包含?
比如myclass.h定義了一個類myclass(只定義類,不定義成員函式), file1.cpp裡#include "myclass.h",編譯得到file1.obj; file2.cpp裡也#in