C++ 函数错误/头文件/内联的多个定义

C++ 函数错误/头文件/内联的多个定义,c++,header,inline,multiple-definition-error,C++,Header,Inline,Multiple Definition Error,抱歉,如果这是重复的,但是我找到的那些。。。嗯,我想我也试过同样的解决办法,但没用。不管怎样,我最近尝试将我常用的随机函数的实现转移到一个头文件中:我知道函数是如何工作的,怀疑我会很快改变它们,所以我认为,文件越少越好(函数也很短) 所以,我试过了。将.cpp文件的内容粘贴到新文件中,并添加了保护。然后把它包括进去,瞧,它起作用了。不幸的是,我包含了它两次,并且发现,我正在将相同函数的副本分发到每个文件,因此出现了错误。(仍然会有点困惑为什么会有头球后卫,因为你最终还是得到了一个副本,但我想是的

抱歉,如果这是重复的,但是我找到的那些。。。嗯,我想我也试过同样的解决办法,但没用。不管怎样,我最近尝试将我常用的随机函数的实现转移到一个头文件中:我知道函数是如何工作的,怀疑我会很快改变它们,所以我认为,文件越少越好(函数也很短)

所以,我试过了。将.cpp文件的内容粘贴到新文件中,并添加了保护。然后把它包括进去,瞧,它起作用了。不幸的是,我包含了它两次,并且发现,我正在将相同函数的副本分发到每个文件,因此出现了错误。(仍然会有点困惑为什么会有头球后卫,因为你最终还是得到了一个副本,但我想是的)。不管怎样,我在谷歌上搜索了一下(等等),发现如果你将它们声明为内联的(在这种情况下这是有意义的),那么预处理器(或者它也是链接器?)就会正确地执行。现在我想起来了。。。作为一个小问题,文件的定义是局部的,还是全局的?(也就是说,如果我在两个文件中包含一个头,并且有一个定义的头保护程序……这两个文件都包含它吗?因为定义发生在不同的文件中,还是只包含一次?如果它包含两次,您将得到多个声明(但不包含定义)同一个函数/类/结构,我认为会引发错误,但我猜它不会出现在不同的文件中?否则,它可能不会被包含,并且它不知道它是什么。因此,再问一下,定义是否是文件的本地定义?)

下面是我在文件中的内容,它的函数被复制(虽然只包含一个函数)

\ifndef RANDOM\u H
#定义随机数
//用于获取系统时间和随机生成函数rand和srand
#包括
#包括
//此函数返回包含范围之间的随机数
内联整数随机范围(常数整数和最小值、常数整数和最大值)
{
如果(最大值>=最小值)
返回值((rand()%(最大值+1分钟))+min);
其他的
返回((rand()%(最小值+1-max))+max);
}
#恩迪夫
然后我就在两个文件中包含了这个文件(即“random.h”)

我错过了什么

编辑:错误消息为:

“随机范围(int-const&,int-const&)”的多重定义|

在休息的时候,我关闭了IDE。重新开放后,一切都得到了修复。显然,添加内联确实解决了这个问题,但是,与运行时的cpp文件不同,头文件(如果没有添加到项目中)不会更新,除非您手动保存它们。储蓄之后,它起了作用。对不起,各位


今天的教训:修复此类错误时,确保文件已更新…

宏定义是翻译单元的本地定义:编译源文件时,预处理器扩展各种预处理器指令(
#define
#include
等),并将结果传递给实际编译器。每个文件只执行一次,而不是仅执行一次。使用include-guard的原因是,同一个头很可能在同一个翻译单元中包含两次。例如,如果您有类型,例如,
Point
,它由类
Rectangle
Triangle
使用,并且您包含了
Rectangle
Triangle
的标题,那么您将得到一个翻译单元,其中包含
Point
的标题两次

在标头中定义函数时,需要向编译器指示它不应使其成为全局可见的定义。通常的方法是使用
inline
,这也向编译器表明,如果有意义,它应该尝试不调用函数。使用
内联
的另一种方法是使函数
为静态
,但在这种情况下,最终的可执行文件中实际上会有函数的多个副本:即使编译器可能在每个翻译单元中使用函数的
内联
版本,在链接时,从任何地方选择并使用一个副本(希望所有其他副本都被丢弃)。例如,当您的函数中有一个本地
静态
变量时,就可以看到差异:

inline int f() {
    static int rc(0);
    return ++rc;
}
static int g() {
    static int rc(0);
    return ++rc;
}

当您从不同的转换单元调用这些函数
f()
g()
时,后者每个文件都有一个计数器,而前者有一个全局计数器。

如果不更改整数本身,最好按值传递整数,而不是按引用传递。是的,该函数最终可能会出现在包含此头的所有源文件中,但不一致。但是它被标记为
内联
,所以没关系。你收到错误信息了吗?
inline int f() {
    static int rc(0);
    return ++rc;
}
static int g() {
    static int rc(0);
    return ++rc;
}