#ifndef在链接两个目标文件时是否阻止定义函数两次?

use*_*693 2 c++ linker object-files

我有两个类实现(.cpp files)

它们都需要一个在header(.h)文件中实现的功能.两个.cpp文件都包含.h文件.编译后,这两个.cpp文件成为两个.o文件.

链接两个目标文件时,是否定义了两次函数?

可以#ifndef防止这种情况吗?

我用过,#ifndef但收到了以下消息:

ld: 1 duplicate symbol for architecture x86_64
Run Code Online (Sandbox Code Playgroud)

Bet*_*eta 5

您必须理解函数声明(具有给定名称和签名的函数的语句)和函数定义(确定函数实际执行的代码)之间的区别.

如果在标题中定义函数,那么将在每个目标文件中定义该函数,当您尝试将它们链接在一起时,您将遇到冲突; #ifndef不会解决这个问题.

如果在头文件中声明函数,并在源文件中定义它(必须将其编译为对象,并与使用它的对象链接),则不会出现此类问题.在这种简单的情况下,#ifndef不需要.

例如,函数foo可以在foo.h:

int foo(int);
Run Code Online (Sandbox Code Playgroud)

并定义于foo.cpp:

int foo(int n)
{
  return(n+3);
}
Run Code Online (Sandbox Code Playgroud)

#ifndef宏解决不同的问题.