我正在尝试使用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
答案 0 :(得分:0)
您构建的示例应该有效,我只是使用Apple LLVM version 7.0.2 (clang-700.1.81)
验证了它。
上述错误报告似乎报告了同样的问题,除非它已修复,除了尝试不使用扩展程序外,您无法执行任何操作。
虽然GNU C
有一些很棒的扩展,但如果您想编写便携式c代码,请尽量避免使用任何GNU C
扩展名。
答案 1 :(得分:-1)
您链接的是该语言的gnu特定扩展。如果你没有使用gnu编译器(我不相信clang是),那么它不一定有效。文档说明要检查处理器中__GNUC__
名称的定义。尝试添加此...
#ifndef __GNUC__
#error Not a GNU compiler, does not include GNU specific extensions
#endif