#pragma once
是写在头文件开头的编译指令,使得编译器能够自动帮我们实现“只编译一次该头文件”,从而避免了多次include该头文件导致的重复定义/声明问题。
在没有#pragma once 之前,我们常用的方法是为这个头文件制定一个独一无二的宏名(比如说叫__Car__),然后使用#ifndef:
#ifndef __Car__ #def __Car__ //头文件中的定义、声明 //... #endif //__Car__
这两种方法有几点不同:
1.较早的编译器并不支持#pragma once
2.如果两个不一样的头文件用了同一个宏名,用#ifndef的方法就会出问题,相当于扔掉了一个头文件
3.#pragma once 似乎只负责保证声明的唯一性,并不保证实现的唯一性,具体来讲:
#pragma once class Test { void func(); };
void Test::func()
{
//do sth.
}
上面这样写的话,有可能出现Test::func()这个函数被定义两次的问题,而
#pragma once class Test { void func() { // do sth. } };
这样写就没问题。估计用#ifndef 配合#endif的话也没问题
(srds,头文件里还是不要写定义了,这里是因为是个OOP的题所以不得不写在.h里面...)