标签在C语言的宏中重新定义

问题描述 投票:-5回答:1

[尝试在C宏中使用goto标签(运行MSVC),但是如果在同一调用程序函数中多次调用该宏,则会出现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标签分配一个唯一的标签,这样,当多次包含goto标签时,就不会有重新定义错误。

是否存在可以应用于宏或替代方法的C关键字?类似于:

            __Uniquelabel__       RTSZ_0; \
            __Uniquelabel__       RTSZ_1; \

有什么想法吗?谢谢!

c visual-c++ macros label redefinition
1个回答
0
投票

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

#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()

© www.soinside.com 2019 - 2024. All rights reserved.