#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
答案 0 :(得分:5)
#pragma once
的定义是当前文件仅包含一次。
如果您将其复制到其他位置,则该文件会有所不同,这意味着它与#pragma once
视角不同。
如果要将文件复制到其他位置并获得与#pragma once
类似的行为,则需要使用包含警示。
你也不应该使用
__HEADER_H__
作为包含守卫,保留使用前导__
并导致微妙的错误。
此外,看了code on bitbucket后,文件queue.h
既没有#include
后卫,也没有#pragma once
后卫,这表明这是一个错误的前提情况下。
如果您正在尝试将一堆.cpp文件整合到一个文件中,并且在这种情况下它们#include
使用相同的文件,那么您将得到这个确切的错误。