#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
定义#pragma once
是当前文件只包含一次.
如果你将它复制到其他地方,那么文件是不同的,这意味着它被视为与#pragma once
透视图不同.
如果要将文件复制到其他位置并获得类似的行为#pragma once
,则需要使用包含保护.
你不应该使用
__HEADER_H__
包含守卫,使用领先__
保留并可能导致微妙的错误.
另外,看过bitbucket上的代码后,该文件queue.h
既没有#include
防护,也没有#pragma once
防护,这表明在这种情况下是错误的前提.
如果你试图将一堆.cpp文件混合到一个文件中,并且#include
在这种情况下它们是相同的文件,那么你将得到这个确切的错误.
归档时间: |
|
查看次数: |
2120 次 |
最近记录: |