c++ - #pragma once 的问题

标签 c++ c gcc

<分区>

#pragma once 在编译我一直在处理的项目时无法正常工作。稍微阅读了该主题后,我发现使用它的一个缺点是如果同一个文件位于不同的位置,那么它不会像另一种使用 include guards 的方式那样工作:

#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 类似的行为,那么您需要使用 include guards。

also you shouldn't be using __HEADER_H__ for the include guard, the use of a leading __ is reserved and can lead to subtle bugs.

此外,查看了 code on bitbucket ,文件queue.h既没有#include守卫,也没有#pragma once守卫,这表明这里的前提是错误的案例。

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

关于c++ - #pragma once 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20807076/

相关文章:

c++ - 在 C++ 中枚举文件名

c++ - 从另一个进程中获取内存

c - 警告 C4047 : '=' : 'int' differs in levels of indirection from 'char *'

c++ - 使用 g++ 编译多个 .cpp 和 .h 文件。我做对了吗?

c++ - 无法通过 is_open 和正确检查读取文本文件?

c++ - 关于常量初始化的困惑

c - 跳过 for 循环的一次迭代

c - C 编程中使用 for 循环写入文件

c - 警告不是编译时常量的函数参数

c++ - Glibcxx 错误编译 FREAK OpenCV 演示文件