标签为clang中的值

时间:2016-05-02 13:44:55

标签: c visual-studio-2015 clang goto

我正在尝试使用Visual Studio 2015中的clang 3.7在c程序中实现“标签为值”(https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html)。

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

'UP000040088':['A0A0T9PBK6'],'UP000001592':['A9IWM9', 'A9IWP5']

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

您构建的示例应该有效,我只是使用Apple LLVM version 7.0.2 (clang-700.1.81)验证了它。

上述错误报告似乎报告了同样的问题,除非它已修复,除了尝试不使用扩展程序外,您无法执行任何操作。

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

答案 1 :(得分:-1)

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

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