在一些大型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>
}
有没有办法像这样做?或者我们可以定义一个宏来做这个吗?
答案 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 /文本编辑器具有自定义代码段。 检查您的工具是否有插件。