#pragma 一次的问题

Problems with #pragma once

本文关键字:一次 问题 #pragma      更新时间:2023-10-16
#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

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

如果将其复制到其他地方,则文件会有所不同,这意味着从#pragma once的角度来看,它被认为是不同的。

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

此外,您不应该将__HEADER_H__用于包含保护,使用前导__是保留的,可能会导致细微的错误。

此外,在查看了 bitbucket 上的代码后,文件queue.h既没有#include保护,也没有#pragma once保护,这表明在这种情况下存在错误的前提。

如果您尝试将一堆.cpp文件修改为一个文件,并且在这种情况下它们#include相同的文件,那么您会收到此确切错误。

相关文章: