C 预处理器宏:有没有办法获得唯一的变量名并重用它?

C 预处理器宏:有没有办法获得唯一的变量名并重用它?,c,c-preprocessor,c99,C,C Preprocessor,C99,每次我的宏被展开时,我都试图使用唯一的变量名,我无法想出解决方案 我有这样的代码 #define _each(results,arr,i,v, f)\ for (i=0;i<len(arr);i++){\ v = arr[i];\ f\ } 如果这有道理的话 我需要增加变量名,因为我有一个嵌套宏的例子 除非您的实际用例比您的示例复杂得多,否则您不需要使用唯一的变量名 保持简单!只需将它们定义为块中的本地名称: #define foreach(results, ar

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

我有这样的代码

#define _each(results,arr,i,v, f)\
  for (i=0;i<len(arr);i++){\
    v = arr[i];\
    f\
  }
如果这有道理的话


我需要增加变量名,因为我有一个嵌套宏的例子

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

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

#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; \
        } \
    }
#定义foreach(结果、数组、len、函数)\
{ \
int i\
\
对于(i=0;i

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

您可以使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuu行
而不是(非标准)
\uuuuuuuuuuuuuuuuu计数器
\uuuu LINE\uuuu
是原始文本(而不是宏替换文本)的源文件中的当前行号。因此,在展开宏期间,它不会发生变化,并且对于提供的每个宏展开,它都会有所不同:

  • 决不能在同一源代码行中两次展开宏
  • 不要从两个不同的源文件中尝试此技巧

由于
i
v
是宏的参数,因此每次使用宏时只需使用不同的名称即可。因此,您可以将其称为嵌套的:
\u each(results,arr,i,v_i,\u each(results,arr,j,v_j))
它是:/。。。嵌套的循环比比皆是!即使如此,您可能仍然可以使用作用域来保护局部变量,尽管您可能必须禁用/忽略某些编译器发出的一些愚蠢的警告。也许您最好编写一个合适的代码生成器(例如,在AWK、Python或…)而不是滥用预处理器,并依赖于这样一个非常非标准的特性。但是,如果您真的想使用
\uu COUNTER\uuuuuu
,应该不会那么困难。也许你可以从中得到一个线索:嘿,谢谢!这真是个好主意。这可能足够了。如果没有人能给出答案,我想就是这样了
#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; \
        } \
    }