最近我在我的項目中遇到了一個問題。我通常在gcc-4中編譯它,但是在嘗試在gcc-3中編譯後,我注意到內聯函數的不同處理。爲了說明這一點,我已經創建了一個簡單的例子:gcc - 2個版本,內聯函數的不同處理
的main.c:
#include "header.h"
#include <stdio.h>
int main()
{
printf("f() %i\n", f());
return 0;
}
file.c:
#include "header.h"
int some_function()
{
return f();
}
header.h
inline int f()
{
return 2;
}
當我編譯gcc-3.4.6中的代碼與:
gcc main.c file.c -std=c99 -O2
我得到鏈接錯誤(F的多個定義),相同的,如果我刪除-O2
標誌。我知道編譯器不需要內聯任何東西,如果它不想要的話,所以我假定它將f放在目標文件中,而不是在main.c
和file.c
的情況下內聯它,從而產生多重定義錯誤。顯然,我可以通過使f
爲靜態來解決這個問題,然後在最壞的情況下,在二進制文件中有幾個f
。
但我試圖編譯此代碼在GCC-4.3.5有:
gcc main.c file.c -std=c99 -O2
,一切都在二進制工作得很好,所以我認爲新的gcc內聯在這兩種情況下f
,也沒有功能f
在所有(在gdb中檢查,我是正確的)。
但是,當我刪除-O2
標誌時,我得到了兩個未定義的對int f()
的引用。 在這裏,我真的不明白髮生了什麼事。這似乎是GCC假設f
會被內聯,所以也沒把它添加到目標文件,但後來(因爲沒有-O2
)決定產生這些功能,而不是內聯調用而這也正是來自的鏈接錯誤。
現在問題來了:我應該如何定義,並宣佈簡單的小功能,我想在線,讓他們可以在整個項目中使用,而不在各種編譯器問題的恐懼?並且讓所有這些都是正確的做法?或者,也許gcc-4被破壞了,除非它們是靜態的,否則我不應該在幾個翻譯單元中有多個內聯函數的定義?
謝謝,這解釋了很多 – 2010-06-23 10:00:57