预处理器宏:有什么方法可以获得唯一的变量名并重用它?

Preprocessor macros: any way to get a unique variable name and reuse it?

每次扩展我的宏时,我都试图使用唯一的变量名,我想不出解决方案

我有这样的代码

#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

如果有道理..

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

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

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

#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 变量 - 一个为宏的每次扩展设置。

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

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