动态定义宏

时间:2017-03-29 17:32:14

标签: c macros

我需要动态定义函数和宏,对于动态函数,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/")

1 个答案:

答案 0 :(得分:0)

  

我需要动态定义函数和宏

然后我害怕你注定不满意。您可以编写一个宏,其替换文本包含宏调用,但您不能通过展开宏来生成宏定义。最终,它归结为标准的paragraph 6.10/2,部分

  

预处理指令由一系列预处理组成   满足以下约束的标记:第一个标记   序列是#预处理令牌(在开头   翻译阶段4 )是源文件中的第一个字符   (可选地,在不包含换行符的空格之后)或   在包含至少一个换行符的空格之后。

(强调补充。)

虽然您可以提供具有宏定义形式的宏替换文本,但替换文本不满足在转换阶段4开始时作为任何类型的预处理指令的要求(其中执行预处理指令) 。宏的扩展产生这种形式的文本是无关紧要的,因为它来得太晚了。

然而,函数定义(和声明)是另一回事。如果您愿意,您当然可以通过宏生成这些,如果您需要具有大量样板代码的多个不同函数,这是合理的做法。