31

谁能告诉我内联函数和静态内联函数有什么区别?

在哪些情况下我应该更喜欢静态内联而不是内联?

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

由于我的函数位于头文件中,并且如果我将其设为静态,是否会出现在我包含该头文件的情况下,静态函数可以在该翻译单元中使用?

4

1 回答 1

44

非静态inline函数声明是指每个使用它的翻译单元(源文件)中的相同函数。

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

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

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

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

于 2012-10-11T09:27:43.910 回答