2016-11-30 44 views
1

我有其在頭文件my.h最初聲明爲具有外部連接(沒有指定存儲類)錯誤由於早期非靜態非內聯函數的靜態線版本

int myfunc(int); 
的函數

這個函數定義和它的調用存在於源文件my.c中 my.c包括my.h

這一切都很好。

但現在我想使這個功能MYFUNC在線 所以我在my.c宣佈一個新的原型

__attribute__((always_inline)) static inline int myfunc(int) 

和之前同樣的功能定義它的話,

不出所料我不斷收到錯誤說

靜態聲明'myf unc'遵循非靜態聲明

我需要爲C參考版本的代碼保留此函數的非靜態非內聯版本,併爲代碼的優化版本提供靜態內聯版本。

我怎樣才能解決這個問題,因爲我需要的功能的靜態聲明,這個現有的源/頭文件設置中我有

一種方式是我改變靜態內聯函數的名稱myfuncinline並使用它!

但是在當前的設置中有沒有什麼辦法。

+0

你能解釋一下你特林更詳細地做什麼,IDK你想用一個不同版本的「參考談論什麼版本「等 –

+0

然後刪除'靜態'。 –

回答

2

用靜態存儲類說明符定義的函數具有內部鏈接。您不能在該翻譯單元之外引用它。

如果你不能在頭文件中更改myfunc的聲明,那麼在源文件中寫兩個 函數。一個叫myfuncreal,這所有的工作,並與靜態聯定義:

__attribute__((always_inline)) static inline int myfuncreal(int a) 
{ 
    //uses parameter a and returns the result 
} 

另一種叫myreal圍繞myfuncreal包裝,定義爲:

int myfunc(int a) 
{ 
    return myfuncreal(a); 
} 
+0

謝謝。也許我在OP中不清楚。靜態內聯版本是特定於平臺的版本,其中一些構造僅在某個目標平臺上有效,例如,說ARM。而其他版本是純粹的C參考代碼,沒有任何平臺特定的結構。所以,如果我換成你說的,C參考版本將無法建立/鏈接。 – goldenmean

+0

@goldenmean您應該爲此使用預處理器指令。 – 2501

0
#ifndef DEBUG 
static inline 
#endif 
int myfunc(int); 

假設DEBUG被定義在您的調試版本中,但不在您的優化版本中。請注意,此示例用於.c文件中的聲明或.h文件中的定義;對於在.h聲明在.C定義做

/* foo.h */ 
#ifdef DEBUG 
int myfunc(int); 
#endif 

/* foo.c */ 
#ifndef DEBUG 
static inline int myfunc(int); 
#endif 
/* code that uses myfunc() */ 
#ifndef DEBUG 
static inline 
#endif 
int myfunc(int) {/* definition */} 
+0

首先,你沒有解釋任何東西。其次,如果沒有定義DEBUG,這會導致同樣的問題。 –

+0

我的解決方案與您的解決方案非常相似,只是它的優點是可讀性強,不會污染名稱空間。我*說*這是在DEBUG被定義爲非優化版本的假設下,任何合理的編譯器都會這樣做。如果不是這種情況,它可以替換爲RELEASE或任何相關的宏。順便說一句,試圖提高你的知名度,通過低於你自己的第二個答案來解決問題的策略可能是你需要互聯網休息的標誌。 –