#pragma一次出现问题

时间:2013-12-27 20:02:19

标签: c++ c gcc

编译我一直在研究的项目时,

#pragma once无法正常工作。稍微阅读了一下这个主题后,我发现使用它的一个缺点是,如果同一个文件位于不同的位置,那么它就不会像使用包含这样的包含守卫那样工作:

#ifndef __SOMETHING_H__ 
#define __SOMETHING_H__ 

这是错误:

../../engine/scene/../common/../bitsquid/queue.h:78:29: error: redefinition of    ‘template<class T> void foundation::queue::reserve(foundation::Queue<T>&, uint32_t)’
../../engine/scene/../common/../bitsquid/queue.h:78:29: error: ‘template<class T> void foundation::queue::reserve(foundation::Queue<T>&, uint32_t)’ previously declared here

您可以看到路径是相同的。我正在使用g ++来编译源代码。我通常会用其他类型的包含警卫替换它,但我想避免这种情况,因为我没有写库。

gcc版本是4.6.3

1 个答案:

答案 0 :(得分:5)

#pragma once的定义是当前文件仅包含一次。

如果您将其复制到其他位置,则该文件会有所不同,这意味着它与#pragma once视角不同。

如果要将文件复制到其他位置并获得与#pragma once类似的行为,则需要使用包含警示。

  

你也不应该使用__HEADER_H__作为包含守卫,保留使用前导__并导致微妙的错误。

此外,看了code on bitbucket后,文件queue.h既没有#include后卫,也没有#pragma once后卫,这表明这是一个错误的前提情况下。

如果您正在尝试将一堆.cpp文件整合到一个文件中,并且在这种情况下它们#include使用相同的文件,那么您将得到这个确切的错误。