#pragma一次出现问题

Jef*_*ton 2 c c++ gcc

#pragma once在编译我一直在研究的项目时,它无法正常工作.稍微阅读了一下这个主题后,我发现使用它的一个缺点是,如果同一个文件位于不同的位置,那么它将不会像使用包含这样的包含警卫的其他方式一样工作:

#ifndef __SOMETHING_H__ 
#define __SOMETHING_H__ 
Run Code Online (Sandbox Code Playgroud)

这是错误:

../../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
Run Code Online (Sandbox Code Playgroud)

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

gcc版本是4.6.3

Pet*_*esh 6

定义#pragma once当前文件只包含一次.

如果你将它复制到其他地方,那么文件是不同的,这意味着它被视为与#pragma once透视图不同.

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

你不应该使用__HEADER_H__包含守卫,使用领先__保留并可能导致微妙的错误.

另外,看过bitbucket上的代码后,该文件queue.h既没有#include防护,也没有#pragma once防护,这表明在这种情况下是错误的前提.

如果你试图将一堆.cpp文件混合到一个文件中,并且#include在这种情况下它们是相同的文件,那么你将得到这个确切的错误.