自动将#pragma once 添加到头文件

Posted

技术标签:

【中文标题】自动将#pragma once 添加到头文件【英文标题】:Automatically add #pragma once to header files 【发布时间】:2013-09-25 16:56:17 【问题描述】:

我尝试从我的个人项目中删除所有不必要的样板代码。我注意到的第一件事是每个头文件的第一行#pragma once。并不那么令人惊讶。 但是,我想要求我的编译器(clang SVN HEAD 版本)自动将此行添加到我的头文件中(例如,使用这样的模式:src/*.hpp)。我认为在极少数情况下,您实际上想要多次包含一个标头。

    你同意吗? 这个问题有没有现成的解决方案? 您认为这是个好主意吗?

使用 clang 工具可以解决这个问题,但我需要一些帮助来启动这个扩展。

    我应该使用哪个 clang 工具?

此工具/扩展的理论用法:

clang --auto-pragma-once src/*.hpp src/*.cpp -o test

感谢您的建议

编辑:

    我不想在我的文件中存储此编译指示一次。因此,任何在文件中放置新内容的编辑器或任何其他工具都无法解决此问题。

    本主题是关于一次性包含头文件,而不是 pragma once。

【问题讨论】:

【参考方案1】:

硬着头皮把编译指示放在你的头文件中。它只有一行,如果什么都没有,可能会混淆查看您文件的其他人。

【讨论】:

不要忘记包含保护,它们仍然是必需的(至少如果你想将代码移植到其他地方---#pragma once 是非常不标准的)。 @JamesKanze 是的,我假设(可能是错误的)如果他使用了编译指示,他知道其中的含义.. @JamesKanze:它是非标准的,但至少受最新版​​本的 Visual C++、G++ 和 Clang 支持,因此您已经可以覆盖更广泛的平台。 @JamesKanze 定义“非常”非标准。是的,它不在 C++ 标准中,但它受到常见编译器(MSVC、gcc、clang、Intel 等)的支持 @JamesKanze:我不知道你的设置,但我目前在哪里工作,我们知道。我认为你不能这样概括它。【参考方案2】:

我不确定您为什么要为此使用 clang。这取决于 在编辑器上,但我认识的每个编辑器都允许你触发 诸如打开名称与特定文件匹配的新文件之类的事情 模式,并在其中插入样板。在工业上,它很漂亮 禁止不要使用它,因为这就是版权的方式 通知被插入。例如,就我而言,如果我创建 一个名为 xyz.hh 的新文件,编辑器提出

/****************************************************************************/
/*      File:       xyz.hh                                                  */
/*      Author:     J. Kanze                                                */
/*      Date:       25/09/2013                                              */
/*      Copyright ....                                                      */
/* ------------------------------------------------------------------------ */

#ifndef xyz_hh_20130925QPIvFK6xMJYLBhSpv58ROPOU
#define xyz_hh_20130925QPIvFK6xMJYLBhSpv58ROPOU

#endif
//  Local Variables:                        --- for emacs
//  mode: c++                               --- for emacs
//  tab-width: 8                            --- for emacs
//  End:                                    --- for emacs
//  vim: set ts=8 sw=4 et filetype=cpp:     --- for vim  

如果我在我的工作域中这样做,版权声明是 不同,包含守卫遵循不同的标准,并且 还有一个#pragma once。

【讨论】:

但是这个解决方案将插入的信息稍后存储在文件中。我不想要这个。也许我的问题具有误导性。 @BalázsÁrva 但是你想要什么?您不能让编译器将每个文件都视为包含#pragma once,因为这会破坏标准库(它至少有一个必须包含多次的标头)。 是的,我知道这会破坏标准库。这就是我将模式添加到示例编译器调用的原因。匹配的文件仅自动包含一次。所以标准库和任何其他文件都不会受到这种行为的影响。

以上是关于自动将#pragma once 添加到头文件的主要内容,如果未能解决你的问题,请参考以下文章

#pragma once 等价于 c++builder

C++中防止多次包含头文件:#pragma once和 #indef的区别

C++中防止多次包含头文件:#pragma once和 #indef的区别

C++中防止多次包含头文件:#pragma once和 #indef的区别

pragma once

#pragma once与#ifndef的区别