【问题标题】:Macro for creating variables in C在 C 中创建变量的宏
【发布时间】:2012-12-26 10:17:12
【问题描述】:

我要创建表格的几个变量:

static char fooObjectKey;
static char bazObjectKey;
static char wthObjectKey;
static char myObjectObjectKey;
...

所以我写了

#define defineVar(x) static char #x ObjectKey

defineVar(foo);
defineVar(baz);
defineVar(wth);
defineVar(myObject);

但我收到错误:Expected identifier or }

我在这里做错了什么? :) 任何帮助表示赞赏

【问题讨论】:

  • 大多数编译器可以显示预处理器的结果。在尝试完全理解复杂的宏时,这是非常宝贵的。
  • 我在 Xcode 中使用 LLVM,你知道我怎样才能看到结果吗? :)
  • @nacho4d with gcc 是gcc -E source.c 我认为clang 是一样的,因为clang 提供了与gcc 兼容的驱动程序所以clang -E source.c
  • 在 Xcode 中找到了如何做到这一点! stackoverflow.com/questions/5937031/xcode-4-preprocessor-output 见@Steven Hepting 的回答

标签: c macros


【解决方案1】:

你需要连接它们:

#define defineVar(x) static char x##ObjectKey

解释:

预处理器运算符## 提供了一种在宏扩展期间连接实际参数的方法。如果替换文本中的参数与## 相邻,则将参数替换为实际参数,删除## 和周围的空白,并重新扫描结果。例如,宏粘贴连接它的两个参数:

#define paste(front, back) front ## back

所以paste(name, 1) 创建了令牌name1

【讨论】:

    【解决方案2】:

    宏中的# 用于字符串化参数,## 用于宏中的连接...在您的情况下,以下是正确的语法..

    #define defineVar(arg) static char arg##ObjectKey
    

    如果你使用这个,

    #define defineVar(x) static char #x ObjectKey
    

    变量声明变成...

    static char "foo" ObjectKey;
    

    【讨论】:

      【解决方案3】:

      使用双哈希进行连接

      #define defineVar(x) static char x##ObjectKey
      

      【讨论】:

        【解决方案4】:
        The ## operator concatenates two tokens into one token
        Hence 
        defineVar(foo) will be replace with static char fooObjectKey
        

        【讨论】:

          猜你喜欢
          • 2012-05-04
          • 2023-04-08
          • 1970-01-01
          • 1970-01-01
          • 2013-10-02
          • 1970-01-01
          • 2017-05-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多