Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内联函数和静态内联函数之间的区别_C++_Static_Compiler Errors_Solaris_Inline - Fatal编程技术网

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

C++ 内联函数和静态内联函数之间的区别,c++,static,compiler-errors,solaris,inline,C++,Static,Compiler Errors,Solaris,Inline,有人能告诉我内联函数和静态内联函数的区别吗 在哪些情况下,我应该选择静态内联而不是内联 我问这个问题是因为我有一个内联函数,在链接过程中我面临编译问题(重新定位错误:…符号已被丢弃,丢弃部分…)。我把它变成了一个正常的函数,它工作了。 现在我的一些高年级学生告诉我尝试使用静态内联。 以下是我的职责: inline void wizSendNotifier (const char* nn_name, bpDU* arg=0, int aspect = -1) { wizuiNotifier*

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

在哪些情况下,我应该选择静态内联而不是内联

我问这个问题是因为我有一个内联函数,在链接过程中我面临编译问题(
重新定位错误:…符号已被丢弃,丢弃部分…
)。我把它变成了一个正常的函数,它工作了。 现在我的一些高年级学生告诉我尝试使用静态内联。 以下是我的职责:

inline void wizSendNotifier (const char* nn_name, bpDU* arg=0, int aspect = -1)
{
   wizuiNotifier* notifier = ::wizNtrKit.getNotifier (nn_name);
   notifier->notify (arg, aspect);
}
这不是在一个类中。这是在头文件中

我想对静态函数的调用应该只在定义静态函数的特定TU中进行


由于我的函数位于头文件中,如果我将其设置为静态的,那么在我包含该头文件的任何地方,静态函数都可以在该翻译单元中使用吗?

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

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

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

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


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

这个函数在一个类中吗?请同时发布声明。wizNtrKit是静态对象吗?它的链接是什么?还有,功能出现在哪里?头文件,源文件?有多少个源文件包含它?函数出现在头文件中。包含头文件的源文件大约有50个注:在
静态
函数的情况下,
内联
位失去其语义含义(如果该函数定义出现在多个TU中则可以);唯一附加到
内联
的是对编译器的提示,大多数编译器几乎忽略了这一点。是的,我所说的
内联
函数也适用于既不是
静态
也不是
内联
的函数声明,只有一个定义规则要求除外。它不要求每个TU中有相同的定义,而是要求只有一个TU包含一个定义。考虑到提问者的代码在
inline
被删除时有效,我怀疑这里发生了一些有趣的事情——如果在多个TU中定义了链接器错误,您可能会看到链接器错误。我认为不需要诊断,但对链接器来说并不困难。