#ifndef...#define...#endif与#pragma once深度解析(不是比较区别)
原创
©著作权归作者所有:来自51CTO博客作者Limer123的原创作品,请联系作者获取转载授权,否则将追究法律责任
——————- 文件 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;
}
出现重定义错误。再看第二个例子:
——————————a.h————————
——————————–main.cpp—————————-
#include<iostream>
#include "a.h"
#include "a.h"
#include "a.h"
#include "a.h"
#include "a.h"
#include "a.h"
using namespace std;
int main()
{
cout << a << endl;
return 0;
}
不会出现错误。
结论:
第一个例子中,只有一个文件包含了.h,#pragma once的引入避免了重定义;
第二个例子,是两个文件包含了.h,我的错误是发生在obj->exe链接过程中,此时#pragma once没起到作用。我可不可以这么理解:
pragma once的作用只对一个文件的多次包含起作用,而对多份文件的包含不起避免重定义错误的作用。