【问题标题】:Preprocessor macros: any way to get a unique variable name and reuse it?预处理器宏:有什么方法可以获取唯一的变量名并重用它?
【发布时间】:2015-09-13 16:54:08
【问题描述】:

每次扩展宏时我都尝试使用唯一的变量名,但我无法提出解决方案

我有类似这样的代码

#define _each(results,arr,i,v, f)\
  for (i=0;i<len(arr);i++){\
    v = arr[i];\
    f\
  }

我想为 I 和 V 分配一个唯一的变量名。

所以当它们被扩展时,我得到了

for(i1=0;i<len(arr);i++){ // first expansion
  v = arr[i1];
  // dostuff
}
for(i2=0;i<len(arr);i++){
  v = arr[i2];
  // do stuff
}

我试过__Counter__,但我不知道如何重用变量

#define m(var1,var2) {\  // example calling use m(i,v)
  var1 ##__COUNTER__ ;\  // prints i1 
  row = array[var1];\    // prints i, need i1
  row = array[var1 ##__COUNTER__##]; // prints i2.. i need i1

如果有道理的话..

我需要增加变量名,因为我有一个嵌套宏的情况!

【问题讨论】:

  • 由于iv 是宏的参数,每次使用时只需使用不同的名称即可。所以你可以称之为嵌套:_each(results, arr, i, v_i, _each(results, arr, j, v_j))

标签: c c-preprocessor c99


【解决方案1】:

您可以使用__LINE__ 代替(非标准)__COUNTER____LINE__ 是原文(不是宏替换文本)源文件中的当前行号。所以它在宏的扩展过程中不会改变,并且对于提供的每个宏扩展都会有所不同:

  • 您永远不会在同一源代码行中将宏展开两次
  • 不要从两个不同的源文件中尝试这个技巧。

【讨论】:

  • 嘿,谢谢!这真是个好主意。这可能就足够了。如果没有其他人可以给出答案,我认为就是这样
【解决方案2】:

除非您的实际用例比您的示例复杂得多,否则您无需使用唯一的变量名。

保持简单!只需将它们定义为块内的本地名称:

#define foreach(results, array, len, function) \
    { \
        int i; \
    \
        for (i = 0; i < len; i++) { \
            unsigned int v; \
    \
            v = array[i]; \
            v = function(v); \
            results[i] = v; \
        } \
    }

在 C 中,每个块都有效地为在其中定义的那些更局部范围的变量获取自己的堆栈区域,因此您可以根据需要拥有尽可能多的 iv 变量——每次扩展一组宏。

【讨论】:

  • 它是:/ ...嵌套for循环比比皆是!
  • 即便如此,您可能仍然可以使用作用域来保护局部变量,尽管您可能不得不禁用/忽略来自某些编译器的一些愚蠢的警告。也许您最好编写一个合适的代码生成器(例如,在 AWK、Python 或...中)而不是滥用预处理器,并依赖这样一个非常非标准的功能。
  • 如果你真的想使用__COUNTER__,应该没那么难。或许你可以从:stackoverflow.com/questions/652815/…
猜你喜欢
  • 2015-08-25
  • 2018-05-12
  • 2016-05-16
  • 1970-01-01
  • 2022-08-19
  • 2022-06-15
  • 1970-01-01
  • 2020-12-24
  • 2010-10-23
相关资源
最近更新 更多