2010-08-25 65 views
4

我的庫包含一個同時用於內部和外部的函數。該函數非常小,我希望編譯器在調用internal時嘗試內聯函數。由於該功能使用不完整類型的信息,因此不能內聯外部呼叫。所以我的模塊也應該總是包含一個具有外部鏈接功能的副本。如何將函數定義爲C99中的內聯內部和外部副本

我想我找到了以下解決方案,但想你的建議:

/* stack.h */ 
struct stack; 
extern bool stack_isempty(struct stack *s); 

/* stack.c */ 
#include "stack.h" 
struct stack { [...]; int size; }; 
inline bool stack_isempty(struct stack *s) { return s->size == 0; } 

我通常使用內聯的其他方式或只把static inline功能在頭文件。但正如所解釋的,這是不可能的。

這種方法是否能提供理想的結果?有沒有人看到這種方法的任何缺點(便攜式C99)?

+0

雖然這個問題從語言的角度來看是有效的,但從實際的角度來看,'inline'對於編譯器在內部調用時是否內聯函數沒有任何影響,所以你可以通過不使用它簡化了你的代碼。 – Leushenko 2017-08-03 09:59:40

回答

5

在C99規則下看起來非常好。因爲stack.c是與externinline函數聲明一起編譯的,所以它將使用外部鏈接進行定義,並且也可以在該文件中內聯。

其他文件只有聲明,所以會鏈接到帶有外部鏈接的版本。

注意,功能不允許限定任何修改的對象具有靜態存儲持續時間,或引用不extern任何功能或全局變量。

+0

謝謝。同時我想到了3個可能的問題,但它們都是無稽之談:1.內聯函數的定義和聲明的順序; 2.結構聲明的聯繫; 3.用戶提供自己的內聯定義來「覆蓋」我的內容。 – schot 2010-08-25 13:47:33

相關問題