如何在多个 C++ 文件中使用 C header.h 而不会出现多个定义错误?

Ale*_*anu 1 c++ compiler-errors header

我想使用 Wireshark 开源项目中“func.h”文件中的函数。我需要在多个 .cpp 文件中使用 funct() 函数,但出现多重定义错误。

函数.h:

    #ifndef func_h
    #define func_h
    #include<string>
    
     void *funct(char *cName)
     {
         std::string name = cName;
         cName+= ".extension";
     }
Run Code Online (Sandbox Code Playgroud)

在 .cpp 文件中,我包含 func.h:

    #include "func.h"
Run Code Online (Sandbox Code Playgroud)

并从 2 个 .cpp 文件调用 funct() 函数:

    funct("program");
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能避免出现多重定义错误?解决方法是将函数定义复制并粘贴到每个 .cpp 文件中并更改函数名称,但这很丑陋。

非常感谢。

fra*_*sco 5

您有两个选择:

  • 您可以将函数的实现移至单独的 .c/.cpp 文件中,仅将声明保留在头文件中。然后编译该源文件,并将其与程序的其余部分链接。例子:

函数.h

#ifndef func_h
#define func_h
#include<string>

void *funct(char *cName);
#endif
Run Code Online (Sandbox Code Playgroud)

函数.cpp

#include "func.h"

void *funct(char *cName)
{
    std::string name = cName;
    cName+= ".extension";
}
Run Code Online (Sandbox Code Playgroud)

您照常编译和链接,例如

g++ -c -o func.o func.cpp
g++ -c -o main.o main.cpp
g++ -o prog main.o func.o
Run Code Online (Sandbox Code Playgroud)
  • inline您在函数的定义中指定关键字。这允许函数出现在多个编译单元中。看到这个问题