【问题标题】:How to define a define in C?如何在 C 中定义定义?
【发布时间】:2011-02-28 15:37:50
【问题描述】:

是否可以编写一个定义#define#define

例如:

#define FID_STRS(x) #x
#define FID_STRE(x) FID_STRS(x)
#define FID_DECL(n, v) static int FIDN_##n = v;static const char *FIDS_##n = FID_STRE(v)

但是:

#define FID_DECL2(n, v) #define FIDN_##n v \
                               FIDS_##n FID_STRE(v)

FID_DECL 工作正常,但会创建两个静态变量。是否可以使FID_DECL2 工作并定义两个定义?

【问题讨论】:

  • “两个静态变量”这有什么问题?
  • @James:两个静态变量都可以,除了我想联系我的字符串的字符串定义:FID_DECL(HELLO, 2) printf("Hello world" FIDS_HELLO) -> "Hello world2"
  • 您可能会从其他东西生成您的 C 代码,例如使用更强大的预处理器,例如 m4GPP

标签: c c-preprocessor


【解决方案1】:

没有;预处理在单程中执行。如果您想要或需要更高级的行为,请考虑使用其他工具来预处理源代码,例如 m4。

此外,替换列表中的##define FIDN... 开头的将被解析为#(字符串化)运算符:该运算符的操作数必须是命名宏参数,即define不是。

【讨论】:

    【解决方案2】:

    在定义宏时,你应该注意一件事 该宏不应该直接调用自身(递归) 或间接。

    我知道两个消耗 8 个字节的静态变量对你来说会很庞大。

    我有办法解决

    #define FID_STRS2(x) #x
    #define FID_STRE(x) FID_STRS2(x)
    #define FID_DECL(n, v) static int FIDN_##n = v;static const char *FIDS_##n = FID_STRE(v)
    

    只需将它们重命名为递归

    【讨论】:

    • 问题是用户是否可以在宏中定义新宏,而不是他们是否可以在宏中使用宏。
    猜你喜欢
    • 1970-01-01
    • 2012-06-03
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2019-01-23
    • 2014-01-09
    • 1970-01-01
    相关资源
    最近更新 更多