[尝试在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; \
有什么想法吗?谢谢!
当前正在研究使用此代码:
#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()
。