标签作为 clang 中的值

labels as values in clang

我正在尝试在 Visual Studio 2015 年使用 clang 3.7 在 c 程序中实现 "labels as values" (https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html)。

作为玩具示例,我有以下导致编译器崩溃的代码(内部错误“致命错误 C1001:编译器中发生内部错误。 1>(编译器文件'c:\agent\build\cache\git\vctools\vctools\compiler\utc\src\p2\main.c',第246行) 1> 要解决此问题,请尝试在上面列出的位置附近简化或更改程序。")。

const void *array_jump[] = {&&S1,&&S2,&&S3,&&S3,&&S4};  

S1:
    goto *array_jump[3];
S2:
    return 2;
S3:
    return 3;
S4:
    return 4;

如果我将数组声明移到它起作用的所有标签之后,直到我在任何语句中包含 array_jump 变量。

S1:
    //comment out and add "return 1;" and it will compile fine
    goto *array_jump[3];
S2:
    return 2;
S3:
    return 3;
S4:
    return 4;

const void *array_jump[] = {&&S1,&&S2,&&S3,&&S3,&&S4}; 

任何人都可以提供一个像上面那样可行的示例吗?这是 clang 的问题还是 Visual Studio 的 "codegen" 方面的问题?

我认为这个错误是相关的,但我不确定: https://connect.microsoft.com/VisualStudio/feedback/details/2103400/crash-in-clang-c2-with-address-of-label-extension

您所链接的是该语言的特定于 gnu 的扩展。如果您没有使用 gnu 编译器(我不相信 clang 是),那么它不一定能工作。文档说要检查处理器中 __GNUC__ 名称的定义。尝试添加这个...

#ifndef __GNUC__
#error Not a GNU compiler, does not include GNU specific extensions
#endif

您构建的示例应该可以工作,我刚刚使用 Apple LLVM version 7.0.2 (clang-700.1.81) 验证了它。

提到的错误报告似乎报告了同样的问题,在它被修复之前,除了尝试不使用该扩展之外,您无能为力。

虽然 GNU C 有一些很棒的扩展,但如果您想编写可移植的 代码,请尽量避免使用任何 GNU C 扩展。