c++ LNK1169由在单独的cpp文件中多次包含标头引起

1tu0hz3e  于 2023-03-14  发布在  其他
关注(0)|答案(2)|浏览(142)

在我的程序中,我遇到了LNK1169,考虑到上下文,我不知道如何导致此错误。
单位.h:

#ifndef UNITS_H
#define UNITS_H

namespace units {
    extern constexpr double N = 1.0;
};

#endif

答:

#pragma once
class A {
public:
    A();
};

A.cpp:

#include "A.h"
#include "units.h"

A::A() {

}

B.h:

#pragma once
class B {
public:
    B();
};

B.cpp:

#include "B.h"
#include "units.h"

B::B() {

}

ErrorTest.cpp:

#include "A.h"
#include "B.h"

int main()
{
    A* _a = new A();
    B* _b = new B();
    return 0;
}

错误信息:

Error   LNK1169 one or more multiply defined symbols found  ErrorTest   C:\Users\---\source\repos\ErrorTest\x64\Debug\ErrorTest.exe 1
Error   LNK2005 "double const units::N" (?N@units@@3NB) already defined in A.obj    ErrorTest   C:\Users\---\source\repos\ErrorTest\ErrorTest\B.obj 1

有没有什么明显的东西我忽略了?我确信我遵守了一个定义规则。
我试着确保我遵循了一个定义规则并改变了我包含units. h的方式,但是错误总是一样的。如果我在多个cpp中包含units. h,我总是得到LNK1169。

oalqel3c

oalqel3c1#

我认为这是因为当你编译a.cpp时,你会得到units::N,它被定义为include的一部分。
然后当你编译b.cpp时,你也会得到units::N作为include的一部分,include保护只在预处理阶段起作用,但此时你已经编译了a.cpp和b.cpp,它们都包含units. h,因为你在两者中都 * 定义了 *(而不是声明了)N,这可能是链接器看到的错误。
如果您想了解更多信息,并且看起来您使用的是VS,这里有一个指向extern文档的链接,其中特别提到extern constexprhttps://learn.microsoft.com/en-us/cpp/cpp/extern-cpp?view=msvc-170

cbwuti44

cbwuti442#

问题extern constexpr double N = 1.0;是一个名为N的变量的定义,该变量具有***外部链接***,因为您使用了extern关键字。因此,当此头文件包含在多个源文件中时,该变量将被定义多次,因此出现错误。

解决这个问题,要么删除extern关键字,这样N将具有***内部链接***,要么如果你使用c++17,用inline替换extern

相关问题