#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里面...)

posted on 2022-02-26 17:16  Duyy  阅读(1002)  评论(0编辑  收藏  举报