【问题标题】:Multiple Definition of "..." c“...”的多重定义 c
【发布时间】:2013-04-02 13:34:59
【问题描述】:

我有一个头文件“USpecs.h”:

#ifndef USPECS_H
#define USPECS_H
#include "Specs.h"


#include <iostream>
#include <vector>

std::vector<Specs*> UcakSpecs;


#endif

我在主函数和另一个名为 Ucak 的类中都使用了这个头文件。

但是当我构建它时会发生以下错误:

Ucak.cpp|6|`UcakSpecs'的多重定义|

正如我之前搜索的那样,#ifndef 应该可以,但事实并非如此。

【问题讨论】:

  • 请出示CPP代码文件
  • 第一个“include”有错字。另外,如果这不是Specs.h(因为你包含它),它是什么?

标签: c++ header


【解决方案1】:

包含保护仅防止在单个翻译单元(即具有包含标头的单个源文件)中出现多个定义。当您包含来自多个源文件的标头时,它们不会阻止多个定义。

相反,您应该在标题中声明:

extern std::vector<Specs*> UcakSpecs;

在一个(也是唯一一个)源文件中定义:

std::vector<Specs*> UcakSpecs;

【讨论】:

    【解决方案2】:

    包含保护仅防止标头多次包含在同一翻译单元中。如果您在多个翻译单元中包含此标头,您将在整个程序中有多个UcakSpecs 定义。

    全局变量的声明方式是在头文件中声明为extern

    #ifndef USPECS_H
    #define USPECS_H
    #inclde "Specs.h"
    
    
    #include <iostream>
    #include <vector>
    
    extern std::vector<Specs*> UcakSpecs;
    
    #endif
    

    声明为extern 的全局变量只是一个声明。

    然后通过在实现文件(可能在USpecs.cpp)中定义它来确保它只在单个翻译单元中定义;

    std::vector<Specs*> UcakSpecs;
    

    【讨论】:

      【解决方案3】:

      #ifndef 仅适用于单个编译单元。由于您有两个(主函数和Ucak 类),因此该变量被定义了两次。

      考虑在头文件中将变量声明为extern

      extern std::vector<Specs*> UcakSpecs;
      

      并在Ucak.cpp 文件中定义它:

      std::vector<Specs*> UcakSpecs;
      

      这应该可行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-29
        • 2011-06-25
        • 1970-01-01
        • 1970-01-01
        • 2019-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多