2012-05-08 47 views
0

我在查找C++編譯器如何決定要定義哪個符號或未定義符號時遇到了一些問題。我的意思是,我如何知道C++源代碼中是否將變量/函數編譯爲已定義或未定義的符號。首先,我認爲所有定義的變量/函數都將被定義爲符號,但似乎並非如此。有沒有一種方法可以準確地確定靜態,外部,內聯......關鍵字呢?C++編譯器 - 生成的符號類型

*更新 這個問題不是關於C++中的定義和聲明,而不是我的代碼是否會編譯。現在我認爲只有在C++源代碼中聲明的某些函數/變量纔會成爲定義的符號,如果我編譯代碼並用nm檢查目標文件。我需要這些信息:定義/聲明的C++函數/變量如何編譯爲定義的/未定義的符號到目標文件(例如ELF)。

+2

你應該看看起來有什麼區別的聲明和定義在C++之間。任何好書都會告訴你。 –

+0

目前還不清楚你在這裏問什麼。查找是否有未定義符號的最簡單方法是嘗試編譯和鏈接代碼。 –

+0

@OliCharlesworth:在許多情況下,如果您有未定義的引用,但沒有嘗試使用這些符號的代碼,編譯器和鏈接器可能保持沉默。 –

回答

0

如果你只聲明但不定義一個變量/函數,它將不會被定義。

// In global/namespace scope 
int i; // defined 
extern int ei; // not defined 
extern int eid = 42; // assignment causes it to be defined 

void foo(); // not defined 
void bar() { } // defined 
+0

專家C編程很好地解釋了這個問題。 – xis

0

當你編譯成Foo.cpp中foo.o的,在Foo.cpp中定義的某些符號會出現在foo.o的,其他人將被「內聯去」。假設這是你的意思,那麼你會發現這是編譯器特定的和實現定義的。有向有關內聯函數GCC的行爲,例如這裏一個有趣的討論:

http://gcc.gnu.org/onlinedocs/gcc/Inline.html

相關問題