c++ - 一个函数的多个定义,即使是在包含保护内部定义的

标签 c++

假设我有一个头文件myheader.h定义如下:

#ifndef MY_HEADER
#define MY_HEADER

int MyFunction(int x)
{
    return x + 1;
}

#endif

然后,我有两个源文件,它们都是 #include这个头文件。这给了我一个编译错误:

multiple definitions of 'MyFunction(int)'

为什么我的头文件中的包含保护不能阻止它被定义两次?

最佳答案

您需要将您的函数标记为内联,如下所示:

#ifndef MY_HEADER
#define MY_HEADER

inline int MyFunction(int x)
{
    return x + 1;
}

#endif

说明:

每次将 .h 包含在任何 .cpp 文件中时,最终都会得到该函数的定义。链接器不喜欢多个定义。但是,如果您标记函数inline,您就是在告诉编译器确保链接器得到满足。

如何让链接器满意的真正方法取决于编译器和链接器,但在实践中,它可以归结为两种策略:

  • 内联函数 - 这意味着函数定义实际上已从生成的代码中删除。相反,无论该函数应该做什么,都将在调用该函数的地方完成。
  • 将函数标记为本地名称 - 链接器知道本地名称特定于特定文件,并且始终将它们分开。

关于c++ - 一个函数的多个定义,即使是在包含保护内部定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35557382/

相关文章:

c++ - 在 C++ 中重新定义一个非虚函数

c++ - FW1FontWrapper IFW1ColorRGBA

C++/Windows - : system ("dir\\b *.dat > tmp.txt") 的含义

c++ - 使用继承而不是 typedef 来实现前向可声明性和回调带来的复杂性

c++ - Direct2D 中的多线程

c++ - 基类到派生类的类型转换

c++ - qmap 可选参数的默认值

c++ - 尝试在 qt 中创建访问器函数

C++ 蛮力攻击函数不返回结果

c++ - 我可以在 await_suspend 期间调用 coroutine_handle::resume 吗?