在链接两个对象文件时,使用#ifndef防止定义一个函数两次
Do #ifndef prevent defining a function twice when linking two object file?
我有两个类实现(.cpp files
)
它们都需要一个在header
(.h)文件中实现的函数。两个.cpp文件都包含.h文件。编译完成后,两个.cpp
文件变成两个.o
文件。
在连接两个目标文件时是否定义函数两次?
#ifndef
可以防止这种情况吗?
我使用#ifndef
,但我得到以下消息,
ld: 1 duplicate symbol for architecture x86_64
您必须理解函数声明(具有给定名称和签名的函数存在的声明)和函数定义(决定函数实际做什么的代码)之间的区别。
如果在头文件中定义函数,则该函数将在每个object文件中定义,并且当您试图将它们链接在一起时将会发生冲突;#ifndef
不能解决这个问题。
#ifndef
。
例如,函数foo
可以在foo.h
中声明:
int foo(int);
并在foo.cpp
中定义:
int foo(int n)
{
return(n+3);
}
#ifndef
宏解决了一个不同的问题
作为Beta答案的替代方案,您可以通过使用inline
关键字在头文件中定义一个自由函数,该函数将包含在多个翻译单元中。想想看:
// Foo.h
int foo(){return 1;}
// UsesFoo1.cpp
#include "Foo.h"
int usesFoo2(){return foo();}
// UsesFoo2.cpp
#include "Foo.h"
int usesFoo1(){return foo();}
// Main.cpp
#include <iostream>
int usesFoo1();
int usesFoo2();
int main()
{
std::cout << usesFoo1() + usesFoo2() << std::endl;
}
这会产生一个链接器错误,因为int foo()
是在两个独立的翻译单元中定义的。但是,如果您在这里添加inline
关键字,则不会产生错误:
// Foo.h
inline int foo(){return 1;}
注意:在类定义内部定义的函数隐式地具有inline
关键字,因此您可以省略它。
相关文章:
- 用C++中的一个变量定义一个常量
- 在类定义之后定义一个私有方法
- 如何定义一个纯抽象基类
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- 如何定义一个没有重复代码的继承的 const 类成员函数?
- 如何在 c++ 中定义一个将被另一个短语替换的短语?
- 是否可以定义一个以向量<T>作为值的unordered_map?
- 我可以定义一个 constexpr 匿名/未命名变量吗?
- 定义一个 void f(void) 函数,但使用来自同一范围的变量?
- 如何在一个函数中定义一个变量,并在另一个函数中访问和更改它?(C++)
- 为什么不建议使用宏符号常量定义一个固定长度的数组呢
- 在C++中,我想通过使用来自变量(例如字符串)的typename信息,从模板中定义一个类对象
- 为什么我必须显式定义一个由固有类提供的方法
- 定义一个带有缓冲区的函数作为卤化物中的边界框参数
- Visual Studio 2017 C++,如何定义一个"环境变量"'Additional Library Directory'?
- 如何键入定义一个专门的 std::set 模板,使用特定的比较函数实例化
- 仅使用 bool 和 char 定义一个 templete 类
- 定义一个工厂函数,该函数返回指向在此工厂函数中创建的函数的指针
- 是否可以定义一个非模板函数,该函数可以将模板化对象作为参数
- 如何在C 中定义一个副操作员