有人能告诉我内联函数和静态内联函数有什么区别吗?
在哪些情况下,我应该更喜欢静态内联而不是内联?
我问这个问题是因为我有一个内联函数,我在链接期间遇到了编译问题(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中完成。
因为我的函数在一个头文件中,如果我把它设为静态的,会不会出现这样的情况:只要我包含这个头文件,静态函数就可以在那个翻译单元中使用?
发布于 2012-10-11 17:27:44
非静态inline函数声明在使用它的每个翻译单元(源文件)中引用相同的函数。
One Definition Rule要求函数定义的主体在包含它的每个TU中都是相同的,并有一个较长的定义“相同”。如果源文件都使用相同的头文件,并且函数不使用任何具有内部链接的全局名称(包括static函数)或在不同TU中定义不同的宏,则通常可以满足这一要求。
我不记得以前遇到过那个特定的链接器错误,但至少有可能是这些限制之一造成的。您有责任满足以下要求:未定义的行为,如果不满足,则不需要诊断。
static inline函数声明引用每个翻译单元中的不同函数,只是恰好具有相同的名称。它可以使用在不同TU中不同的static全局名称或宏,在这种情况下,该函数在不同TU中的行为可能会有所不同,即使它在头文件中的定义“看起来是一样的”。
由于这种差异,如果函数包含任何static局部变量,那么根据它是否为static,它的行为会有所不同。如果它是static,那么每个TU都有自己的函数版本,因此也有自己的static局部变量副本。如果只有inline,那么所有TU使用的static局部变量只有一个副本。
https://stackoverflow.com/questions/12836171
复制相似问题