在 C 的宏中重新定义标签
Labels redefined in Macro in C
尝试在 C 宏 (运行 MSVC) 中使用 goto 标签,但如果在同一个调用函数中多次调用该宏,则会出现 C2045 标签重新定义错误。
我尝试使用此示例中的 __label__:
https://www.geeksforgeeks.org/local-labels-in-c/
但该标签关键字可能只是 gcc,因为 MSVC 报告标签未定义。
我知道它真的很混乱和愚蠢,但我正在编写一个转换器来将 MASM 代码转换成 C。在 MASM 中,标签是使用 LOCAL 指令在本地定义的,GCC 使用 __label__,但是什么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; \
有什么想法吗?谢谢!
currently looking into using this code:
#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()
。
尝试在 C 宏 (运行 MSVC) 中使用 goto 标签,但如果在同一个调用函数中多次调用该宏,则会出现 C2045 标签重新定义错误。
我尝试使用此示例中的 __label__: https://www.geeksforgeeks.org/local-labels-in-c/ 但该标签关键字可能只是 gcc,因为 MSVC 报告标签未定义。
我知道它真的很混乱和愚蠢,但我正在编写一个转换器来将 MASM 代码转换成 C。在 MASM 中,标签是使用 LOCAL 指令在本地定义的,GCC 使用 __label__,但是什么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; \
有什么想法吗?谢谢!
currently looking into using this code:
#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()
。