------------------- 文件 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
到底是为了防止头文件被二次啥啥呢?
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
으아아아