我需要动态定义函数和宏,对于动态函数,followinf代码工作正常,但是当我尝试在第一个中添加宏时它失败了。 有没有办法获得所需的行为
#define INIT_PATH_FUNCTION(UCI_PATH, DPATH) \
struct ctx *ctx_##_PATH; \
int print##_PATH(char *package) \
{\
print("package %s \n", package); \
return 0; \
}\
#define foreach_file_##PATH(path) \
for (section = print##_PATH(path); \
section != NULL; \
section = print##_PATH(path))\
#define PRINT(UCI_PATH, path) print##_PATH(path)
INIT_PATH_FUNCTION(test, "/etc/")
INIT_PATH_FUNCTION(test2, "/root/")
答案 0 :(得分:0)
我需要动态定义函数和宏
然后我害怕你注定不满意。您可以编写一个宏,其替换文本包含宏调用,但您不能通过展开宏来生成宏定义。最终,它归结为标准的paragraph 6.10/2,部分
预处理指令由一系列预处理组成 满足以下约束的标记:第一个标记 序列是
#
预处理令牌(在开头 翻译阶段4 )是源文件中的第一个字符 (可选地,在不包含换行符的空格之后)或 在包含至少一个换行符的空格之后。
(强调补充。)
虽然您可以提供具有宏定义形式的宏替换文本,但替换文本不满足在转换阶段4开始时作为任何类型的预处理指令的要求(其中执行预处理指令) 。宏的扩展产生这种形式的文本是无关紧要的,因为它来得太晚了。
然而,函数定义(和声明)是另一回事。如果您愿意,您当然可以通过宏生成这些,如果您需要具有大量样板代码的多个不同函数,这是合理的做法。