c++链接错误,始终想不通
天蓬老师
天蓬老师 2017-04-17 15:37:39
0
2
425

------------------- 文件 1.h -----------------------------------

#pragma once
class A
{
public:
    static int x;

public:
    void func();
};

int A::x = 1;

-------------------- 文件 1.cpp -----------------------

#include "1.h"

void A::func()
{
    ;
}

-------------------- 文件 main.cpp -----------------------

#include<iostream>
#include"1.h"

int main()
{
    A a;

    return 0;
}

一起运行报错:

int A::x = 1;是应该放在cpp里,但是放在.h里的话,#pragma once防止头文件被二次编译,怎么还会报错呢,我的理解是如果去掉#pragma once它才会报这样的错,但是事实却是这样,我不知道这是为什么?或者我对#pragma once的理解有误?(PS:不要讨论#ifndef...#define...#endif#pragma once的区别,重点不是这个)

我的想法是二次编译(网上博文看来的)这个说法是不是错的,#pragma once到底是为了防止头文件被二次啥啥呢?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

모든 응답(2)
伊谢尔伦

int A::x가 1.cpp와 main.cpp에 각각 두 번 정의되어 있고 링커는 어느 것이 올바른지 알 수 없기 때문입니다.

1.cpp에 int A::x = 1;을 넣을 수 있습니다.

pragma 한 번의 기능은 여러 컴파일을 방지하는 것이 아니라 여러 번 포함하는 것입니다. pragma를 한 번 작성하는지 여부에 관계없이 1.h가 포함된 각 cpp 파일은 1.h의 복사본을 해당 컴파일 단위에 복사합니다. . 컴파일할 때 pragma Once의 기능은 동일한 헤더 파일을 여러 번(직접 또는 간접적으로) 포함하지 않는 것입니다.

아아

으아악

main.cpp

으아악

main.cpp는 a.h가 한 번만 포함되므로 int a를 재정의하지 않고도 정상적으로 컴파일할 수 있습니다.

左手右手慢动作

두 답변 모두 헤더 파일에 문제가 도입되지 않았다고 했는데 왜 아직도 파악하려고 하시나요? 나는 당신에게 모든 문제를 말했습니다.


int A::x = 1; 이 문장은 CPP로 작성되어야 합니다. 일반적으로 데이터 멤버의 초기화는 생성자에서 수행됩니다.

1.cpp

으아아아
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿