【问题标题】:Can any one explain about X-macros with example code to use them? [closed]任何人都可以用示例代码解释 X 宏以使用它们吗? [关闭]
【发布时间】:2013-11-04 11:44:22
【问题描述】:

我正在尝试详细了解 X-macros 主题。但是并没有完全清楚这一点。如果哪位高手能用“如何使用,如何调用”的例子来解释这个话题就更好了。

我找到了几篇文章,但没有完全清楚这一点。在所有地方,他们都使用了我无法使用那些 X 宏的代码。

提前致谢 帕萨

【问题讨论】:

    标签: c macros x-macros


    【解决方案1】:

    你基本上是#define一个变量列表作为占位符宏X的参数:

    #define X_LIST_OF_VARS \
        X(my_first_var) \
        X(another_variable) \
        X(and_another_one)
    

    然后你使用模板:

    #define X(var) do something with var ...
    X_LIST_OF_VARS
    #undefine X
    

    制作代码块。例如打印所有变量:

    #define X(var) printf("%d\n", var);
    X_LIST_OF_VARS
    #undefine X
    

    将生成:

    printf("%d\n", my_first_var);
    printf("%d\n", another_variable);
    printf("%d\n", and_another_one);
    

    【讨论】:

      【解决方案2】:

      想法是您重新定义宏 X 以使数据适合您当前的目的。

      您至少需要 2 个文件。首先是一个包含必要信息的巨大表格,以及使用数据的其他表格。

      table.x:

      X("Human",  2, HUMAN)
      X("Spider", 8, SPIDER)
      

      module.c:

      // ID constants
      enum {
      #define X(description, legs, id) id,
      #include "table.x"
      #undef X
          COUNT   // Last element is total number of elements
      };
      
      // Leg array
      int NumberOfLegs [] = {
      #define X(description, legs, id) legs,
      #include "table.x"
      #undef X
      };
      
      // Description array
      const char * Descriptions [] = {
      #define X(description, legs, id) description,
      #include "table.x"
      #undef X
      };
      

      预处理后的输出将是:

      // ID constants
      enum {
          HUMAN,
          SPIDER,
          COUNT   // Last element is total number of elements
      };
      
      // Leg array
      int NumberOfLegs [] = {
          2,
          8,
      };
      
      // Description array
      const char * Descriptions [] = {
           "Human",
           "Spider",
      };
      

      在上面的示例中,向表中添加新项目很容易。如果您分别管理这些列表,则更容易出错。

      编辑:

      关于宏用法的一些说明。

      在第一行 #define X(description, legs, id) legs, 我们定义 X 宏。宏的参数数量必须与我们的table.x 在每一行的参数数量相同。对于这种用法,我们只对legs 参数感兴趣。注意参数名是没有意义的,我们也可以#define X(a, b, c) b,

      第二行#include "table.x" 包含table.xmodule.c 的内容。由于宏 X 已定义,预处理器通过调用 X 对每一行进行文本替换。

      第三行#undef X 只是为了方便。我们删除了X 的定义,以便以后可以重新定义它而不会出现编译器抛出警告。

      【讨论】:

      • 如果你不是我的,你能解释一下下面的代码你在上面的例子中使用了什么。 #defineX(description,legs,id)legs,#include "table.x" #undef X
      • @user1537070 查看我的编辑。
      • @user694733 我看不出使用 2 个文件的原因。我可以知道您为什么说要使用至少 2 个文件吗?
      • @nomanpouigt 正如其他答案所示,只能使用一个文件来完成。使用 2 文件方法,最大行长度问题较少,但对于现代编译器来说,这不再是大问题了。
      猜你喜欢
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2016-04-09
      相关资源
      最近更新 更多