2010-01-23 33 views
1

#包括是否有可能做的东西沿着这些路线:传递变量通过的#define

#define import_and_other(s)\ 
something\ 
#include s 

这样的:

import_and_other("file.h") 

变为:

something 
#include "file.h" 

基本上有是某些文件始终需要在包含之前采取的相同操作,所以我想包装#include以执行这些操作。

+0

为什么你总是需要在每个'import_and_other'包含文件之前做同样的事情? –

+0

谢谢大家的答案,我发现了一种不同的方式来做到这一点。为了好奇,我已经在滥用预处理器,因为它被用来连接和操作JS文件。希望能够将包含的文件包装在函数文字中: function(){ the_file }(); –

回答

2

不!

C99标准说(第6.10.2节):

形式

# include pp-tokens new-line 

的预处理指令(不匹配的先前的两个形式中的一种)是允许的。包含在指令中的预处理 令牌的处理方式与正常文本中的处理方式相同。 (当前定义为宏名称的每个 标识符将被其替换列表 预处理标记替换。)所有替换之后产生的指令将与前两种形式的 之一匹配。

然而,还有另外一个规则(第10.6.3.2,在“#操作符”),它说:

替换列表中的每个#预处理标记为函数宏应 后跟一个参数作为替换列表中的下一个预处理标记。

宏扩展中的'#include'失败了这个约束 - 单词'include'不是宏类函数的参数。

这会阻止您生成(可用)'#include'指令。在任何情况下,宏膨胀期间,存在其中表示另一个规则(第10.6.3.4):

所得完全宏取代预处理标记序列不被处理 ,即使它类似于一个预处理指令。

这意味着您无法从宏展开的结果中生成任何预处理器指令。

不幸的是,你的努力注定要失败。

+0

1)指令只能跨越一行。 2)指令开始它自己的各自的行。 3)#是字符串化运算符。所以失败注定了。 –

1

不,但您可以制作自己的包含文件,然后#include它。使用您选择的import_and_other名称命名头文件。 #define替换文本是真正多线的,它只是为了您的利益而包装。

1

我对此表示怀疑。但是可以通过包含另一个文件并在该文件中执行任何您想要的操作来达到相同效果。这将实现你正在尝试做的事情。