首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内联函数与静态内联函数的区别

内联函数与静态内联函数的区别
EN

Stack Overflow用户
提问于 2012-10-11 17:15:15
回答 1查看 19.8K关注 0票数 31

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

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

我问这个问题是因为我有一个内联函数,我在链接期间遇到了编译问题(relocation error:... symbol has been discarded with discarded section ...)。我把它变成了一个正常的函数,它起作用了。现在我的一些前辈告诉我尝试使用静态内联。下面是我的函数:

代码语言:javascript
复制
inline void wizSendNotifier (const char* nn_name, bpDU* arg=0, int aspect = -1)
{
   wizuiNotifier* notifier = ::wizNtrKit.getNotifier (nn_name);
   notifier->notify (arg, aspect);
}

这不是在一个类里面。这是在一个头文件中!

我认为对静态函数的调用应该只在定义它的特定TU中完成。

因为我的函数在一个头文件中,如果我把它设为静态的,会不会出现这样的情况:只要我包含这个头文件,静态函数就可以在那个翻译单元中使用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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局部变量只有一个副本。

票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12836171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档