【发布时间】:2011-08-17 22:33:10
【问题描述】:
我试图弄清楚如何使用 GCC 为 #include 语句构建变量字符串。
我的想法是,对于我编写的每个源模块,我都希望包含一个在构建过程早期创建的动态生成的 C 源作为标头。
生成此文件不是问题。不幸的是,包括它。
到目前为止我所拥有的是(identities.h):
// identities.h
# define PASTER2(str) #str
# define PASTER(str) PASTER2(str ## .iden)
# define EVALUATOR(x) PASTER(x)
# define IDENTITIES_FILE EVALUATOR(__FILE__)
# include IDENTITIES_FILE
理想情况下,这将像这样使用(main.c):
//main.c
# include "identities.h"
int main() {return 0;}
在编译到 yield 之前,预处理器会在一次传递中对其进行扩展:
//main.c (preprocessed)
# include "main.c.iden"
int main() {return 0;}
我使用的两个间接级别(PASTER 和 EVALUATOR)是 this 帖子的结果。
不幸的是,这不起作用,我留下了错误:
obj/win32/dbg/main.o
In file included from main.c:1:0:
identities.h:42:1: error: #include expects "FILENAME" or <FILENAME>
我认为问题在于 include 语句缺少引号。有什么想法吗?
【问题讨论】:
-
如果你有一个“动态生成的 C 源代码”,那么你能动态生成一个包含所有你想要包含的头文件的新头文件吗?虽然我仍然很想知道是否有可能做你想做的事。
-
简短回答:你不能这样做,期间。
-
@leet:不,这个问题需要一种绝对简约的方法来修改当前的构建系统。已经同意我们将尝试这样做,通过编辑每个文件以包含单个通用头文件“identities.h” - 并且只包含一个文件。
-
@AlexandreC。奇怪,我能做到。我不能存在于你的宇宙中;-)。我认为你的意思是你不能用 standard C/C++ 做到这一点。
标签: c macros include c-preprocessor