-1

我正在尝试在我的代码中包含来自《数字食谱》一书的头文件。我必须包含的头文件是 nr3.hpp 和 interp_1d.hpp。interp_1d需要定义nr3才能工作。

我将编写一些出现在 interp_1d.hpp 上的代码,以便您了解我正在处理 interp_1d 代码的内容:

struct Base_interp{
...
};
Int Base_interp::locate(const Doub x){
...
}
...
Doub BaryRat_interp::interp(Doub x){
...
}

此头文件中没有标头保护。结果,当我尝试在多个其他头文件中输入它时,我收到错误“66 个重复符号用于架构 x86_64”。

我的代码结构如下:

myPulse.hpp:
#include "nr3.hpp"
#include "interp_1d.hpp"

calc1.hpp:
#include "myPulse.hpp"

calc2.hpp:
#include "myPulse.hpp"

main.cpp:
#include "myPulse.hpp"
#include "calc1.hpp"
#include "calc2.hpp"
#include "nr3.hpp"
#include "interp_1d.hpp"

我不知道如何克服这个问题。我希望能够在不止一部分代码中使用 interp_1d.hpp 函数。我尝试包括头守卫,但这不起作用:

#ifndef Interp_1d
#define Interp_1d

#endif

有谁知道我如何在多个其他标头中使用 interp_1d 标头而不会发生此错误?

4

1 回答 1

0

处理单个文件时(或为书籍简洁起见),可以简化一些代码,但会使多文件大小写错误。

在您的情况下,缺少标头保护,并且inline缺少(或要放置定义的 cpp 文件)。

所以你不能按原样使用它们。

您有:

  • header/cpp 文件的拆分代码:

    // interp_1d.hpp
    #pragma once // or include guards
    struct Base_interp{
    //...
    };
    
    //interp_1d.cpp
    #include "interp_1d.hpp"
    Int Base_interp::locate(const Doub x){
    //...
    }
    
    Doub BaryRat_interp::interp(Doub x){
    //...
    }
    
  • 或放置额外的inline/ static(尽管并不总是足够/可能(例如全局变量))和标头保护。

    // interp_1d.hpp
    #pragma once // or include guards
    struct Base_interp{
    //...
    };
    
    inline Int Base_interp::locate(const Doub x){
    //...
    }
    
    inline Doub BaryRat_interp::interp(Doub x){
    //...
    }
    
于 2021-10-04T15:29:44.117 回答