-1

我想要include一个宏扩展的结果。好像include只知道<>""?

这失败了:

#define audio sinwave

#ifdef audio
#include audio".c"
/*#include "sinwave.c"*/
#endif

但这有效:

#ifdef audio
        if(i==0){set_audio((char *)audio);return;}
#endif
4

3 回答 3

2

你可以这样做:

#define audio audio

#define FF(X) #X
#define F(X) FF(X.c)

#ifdef audio
#include F(audio)
#endif

也就是说,.c在将所有内容放入字符串之前,您必须附加。相邻字符串的通常连接"audio" ".c" -> "audio.c"发生在比预处理更晚的编译阶段,因此#include指令无法处理此问题。

于 2012-09-22T10:44:55.577 回答
1

不可以。不能像这样使用预处理器指令。您可以使用宏来连接和字符串化名称,但这是另一种情况。如果你需要这个,你很可能应该重新考虑你的设计,因为它目前还不够好。

于 2012-09-22T09:47:10.313 回答
0

也许我不清楚......但我看到你在问几个不同的问题......

我认为您询问是否可以包含源文件,是的,您可以,但这不是最好的主意;看到这里很好的讨论为什么。

如果您想知道使用“...”与 <...> 包含文件,区别在于引号是当文件位于本地目录中时(或者您想要包含文件的路径),<> 是当文件在您的搜索路径中时。

如果你想对文件名进行字符串化,那么 Jens Guestedt 的答案就是你想要的......但我质疑这样做背后的逻辑......

为什么不将 .c 文件正常包含在您的项目中(将其添加到您的 makefile 或其他文件中),然后将有问题的代码(或 while 文件)包装在 #ifdef 中?这是有条件地编译代码的更标准的方法。

于 2012-09-22T13:29:03.590 回答