有人能告诉我内联函数和静态内联函数之间有什么区别吗?
在哪种情况下,我更喜欢内联静态内联?
我问这个问题,因为我有一个内联函数,我在链接(relocation error:... symbol has been discarded with discarded section ...
)时遇到编译问题。我使它成为一个正常的功能,它工作。
现在我的一些老人告诉我尝试使用静态内联。
以下是我的功能:
inline void wizSendNotifier (const char* nn_name, bpDU* arg=0, int aspect = -1)
{
wizuiNotifier* notifier = ::wizNtrKit.getNotifier (nn_name);
notifier->notify (arg, aspect);
}
这不在课堂内。这是在头文件中!
我想对静态函数的调用只能在定义它的特定TU中完成。
由于我的函数位于头文件中,并且如果我将其设置为静态,是否会包含该头文件,该静态函数可用于该翻译单元?
答案 0 :(得分:40)
非静态inline
函数声明引用使用它的每个转换单元(源文件)中的相同函数。
一个定义规则要求函数定义的主体在包含它的每个TU中都是相同的,并且具有“相同”的长定义。如果源文件都使用相同的头,并且假设该函数不使用任何具有内部链接(包括static
函数)的全局名称或在不同TU中定义不同的任何宏,则通常会满足这一要求。
我不记得以前遇到过那个特定的链接器错误,但至少可能是其中一个限制是负责任的。您有责任满足要求:未定义的行为,如果不满足则无需诊断。
static inline
函数声明引用每个翻译单元中的不同函数,恰好具有相同的名称。它可以使用不同TU中不同的static
个全局名称或宏,在这种情况下,即使在头文件中的定义“看起来相同”,该函数在不同的TU中的行为也可能不同。
由于存在这种差异,如果函数包含任何static
个局部变量,那么根据它是否为static
,它的行为会有所不同。如果它是static
,则每个TU都有自己的函数版本,因此它有自己的static
局部变量副本。如果它只是inline
,那么所有TU使用的static
局部变量只有一个副本。