内联函数和静态内联函数之间的区别

时间:2012-10-11 09:15:15

标签: c++ static compiler-errors solaris inline

有人能告诉我内联函数和静态内联函数之间有什么区别吗?

在哪种情况下,我更喜欢内联静态内联?

我问这个问题,因为我有一个内联函数,我在链接(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中完成。

由于我的函数位于头文件中,并且如果我将其设置为静态,是否会包含该头文件,该静态函数可用于该翻译单元?

1 个答案:

答案 0 :(得分:40)

非静态inline函数声明引用使用它的每个转换单元(源文件)中的相同函数。

一个定义规则要求函数定义的主体在包含它的每个TU中都是相同的,并且具有“相同”的长定义。如果源文件都使用相同的头,并且假设该函数不使用任何具有内部链接(包括static函数)的全局名称或在不同TU中定义不同的任何宏,则通常会满足这一要求。

我不记得以前遇到过那个特定的链接器错误,但至少可能是其中一个限制是负责任的。您有责任满足要求:未定义的行为,如果不满足则无需诊断。

static inline函数声明引用每个翻译单元中的不同函数,恰好具有相同的名称。它可以使用不同TU中不同的static个全局名称或宏,在这种情况下,即使在头文件中的定义“看起来相同”,该函数在不同的TU中的行为也可能不同。

由于存在这种差异,如果函数包含任何static个局部变量,那么根据它是否为static,它的行为会有所不同。如果它是static,则每个TU都有自己的函数版本,因此它有自己的static局部变量副本。如果它只是inline,那么所有TU使用的static局部变量只有一个副本。