1

在一些大型 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>
}

有没有办法做到这一点?或者我们可以定义一个宏来做到这一点?

4

5 回答 5

8

有没有办法做到这一点?

不。

你能做的最好的事情就是把你所有的#include指令放到一个专用的头文件中,然后#include在任何需要它的地方放置那个单一的头文件。

于 2013-08-18T11:25:20.587 回答
5

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

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

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

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

复制/粘贴意味着复制

重复代码(例如函数体)是不好的。但是,#include指令在技术上不是代码。

于 2013-08-18T11:45:39.300 回答
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"

一次包括它们

于 2013-08-18T11:26:33.257 回答
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 个标头。

于 2013-08-18T13:22:12.337 回答
0

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

于 2013-08-18T11:42:10.187 回答