我怎么能只写一次“#include”?

时间:2013-08-18 11:23:24

标签: c++ macros c-preprocessor

在一些大型C ++项目中,有许多#include指令。例如,

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

在这个例子中我必须写四个#include。我很懒,我只想写一次。也许是这样的:

#include {
    <iostream>
    <boost/asio.hpp>
    <boost/bind.hpp>
    <boost/date_time/posix_time/posix_time.hpp>
}

有没有办法像这样做?或者我们可以定义一个宏来做这个吗?

5 个答案:

答案 0 :(得分:8)

  

有没有办法像这样做?

没有

您可以做的最好的事情是将所有#include指令放入专用的头文件中,然后#include将该单个标头放在任何需要的地方。

答案 1 :(得分:5)

你不能这样做,因为#include使用预处理器,预处理器就像摇滚一样愚蠢。

但是,您可以编写自己的附加预处理器,将* .cpp文件作为输入,并将扩展的#include语法转换为标准语法。预处理器的示例是moc

或者您可以将所有包含放入单个文件中,但这会增加不必要的依赖关系,从长远来看会增加编译时间。

就个人而言,我不会打扰。

  

复制/粘贴意味着复制

复制代码(例如函数体)很糟糕。但是,#include指令在技术上不是代码。

答案 2 :(得分:1)

一种解决方案是将所有这些放在文件“files_to_be_included.h”

files_to_be_included.h

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

然后使用

#include "files_to_be_included.h"

立即包含所有内容

答案 3 :(得分:1)

这是一个你可以使用的宏(虽然我不想这样做,但它在编写宏时做了一个很好的小练习):

#define HASH #
#define F(X) X

#define INCLUDE(X) F(HASH)include <X>

#define FEI_1(X, ...) INCLUDE(X)
#define FEI_2(X, ...) INCLUDE(X) NEW_LINE FEI_1(__VA_ARGS__)
#define FEI_3(X, ...) INCLUDE(X) NEW_LINE FEI_2(__VA_ARGS__)
#define FEI_4(X, ...) INCLUDE(X) NEW_LINE FEI_3(__VA_ARGS__)
#define FEI_5(X, ...) INCLUDE(X) NEW_LINE FEI_4(__VA_ARGS__)
#define FEI_6(X, ...) INCLUDE(X) NEW_LINE FEI_5(__VA_ARGS__)
#define FEI_7(X, ...) INCLUDE(X) NEW_LINE FEI_6(__VA_ARGS__)
#define FEI_8(X, ...) INCLUDE(X) NEW_LINE FEI_7(__VA_ARGS__)

#define INCLUDE_BLOCK_(_1,_2,_3,_4,_5,_6,_7,_8,NAME,...) NAME
#define INCLUDE_BLOCK(...) INCLUDE_BLOCK_(__VA_ARGS__, \
    FEI_8,FEI_7,FEI_6,FEI_5,FEI_4,FEI_3,FEI_2,FEI_1)(__VA_ARGS__)

如果您将其粘贴在头文件header_header中,那么您将能够按如下方式使用它:

#include <header_header>

INCLUDE_BLOCK(
    iostream,
    boost/asio.hpp,
    boost/bind.hpp,
    boost/date_time/posix_time/posix_time.hpp)

/* Write Some Code Here */

此解决方案并非完全可行,为了编译代码,您现在需要运行预处理阶段两次并插入NEW_LINE个字符。

gcc -E main.cpp -o main.e.cpp
sed -i 's/NEW_LINE/\n/g' main.e.cpp
g++ main.e.cpp -o a.out

可以扩展此代码以创建特定的boost包含块,从而无需继续添加boost部分。当前实现的一个限制是您只能包含8个标题。

答案 4 :(得分:0)

某些IDE /文本编辑器具有自定义代码段。 检查您的工具是否有插件。