【问题标题】:Labels redefined in Macro in C在 C 中的宏中重新定义的标签
【发布时间】:2019-10-20 21:36:57
【问题描述】:

尝试在 C 宏(运行 MSVC)中使用 goto 标签,但如果在同一个调用者函数中多次调用该宏,则会出现 C2045 标签重新定义错误。

我已尝试使用此示例中的 __label__: https://www.geeksforgeeks.org/local-labels-in-c/ 但该标签关键字可能只是 gcc,因为 MSVC 报告标签未定义。

我知道这真的很模糊和愚蠢,但我正在编写一个转换器来将 MASM 代码转换为 C。在 MASM 中,标签是使用 LOCAL 指令在本地定义的, __label__ 由 GCC 使用,但是 MSVC 提供了什么作为解决方案?

#include <stdint.h>
#include <stdio.h>

#define     Loopy(AA) {              \
   RTSZ_0:;                          \
   if (AA >= 5) { goto RTSZ_1; }     \
   AA += 1;                          \
   goto RTSZ_0;                      \
   RTSZ_1:;                          \
}                               

int main()
{
    int AA = 0;

    Loopy(AA);
    Loopy(AA);

    return 0;
}

我希望为 goto 标签分配一个唯一标签,以便在多次包含时不会出现重新定义错误。

是否有可以应用于宏的 C 关键字或解决方法? 比如:

            __Uniquelabel__       RTSZ_0; \
            __Uniquelabel__       RTSZ_1; \

有什么想法吗?谢谢!

【问题讨论】:

  • 大多数人会说像这样的宏一开始就是个坏主意,更不用说 goto 了。让我们看看能否找到更好的方法来实现您的目标。
  • 那个宏只是编写while 循环的一种非常尴尬的方式。所以这个问题的答案很简单,“不要那样做!”
  • 我知道这真的很混乱而且很愚蠢,但我正在编写一个转译器来将 MASM 代码转换为 C。在 MASM 中,标签是使用 LOCAL 指令在本地定义的,label 是GCC 使用,但 MSVC 提供什么作为解决方案?谢谢。
  • 你应该在你的问题中这么说。
  • 抱歉...目前正在考虑使用此代码:#define S1(x) #x #define S2(x) S1(x) #define RTSZ "RTSZ_" S2( LINE) ":" printf("%s", RTSZ); printf("%s", RTSZ);输出 RTSZ_25:RTSZ_26:

标签: c visual-c++ macros label redefinition


【解决方案1】:

目前正在研究使用此代码:

#define S1(x) #x
#define S2(x) S1(x)
#define RTSZ "RTSZ_" S2(__LINE__) ":"

实际上,只要每个源代码行不超过一个宏调用,就可以使用上述内容生成唯一标签:

#define RTSZ(i) RTSZ1(i, __LINE__)
#define RTSZ1(i, l) RTSZ2(i, l)
#define RTSZ2(i, l) RTSZ_##i##_##l

#define     Loopy(AA) {              \
   RTSZ(0):                          \
   if (AA >= 5) { goto RTSZ(1); }    \
   AA += 1;                          \
   goto RTSZ(0);                     \
   RTSZ(1): ;                        \
}

中间的RTSZ1() 宏用于扩展__LINE__ 宏,类似于您方法中的S2()

【讨论】:

  • 感谢 Armali 的提示!我会尝试这种方法。
  • 现在工作得很好! :)
猜你喜欢
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 2018-11-12
  • 1970-01-01
相关资源
最近更新 更多