标签作为 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
有一些很棒的扩展,但如果您想编写可移植的 c 代码,请尽量避免使用任何 GNU C
扩展。
我正在尝试在 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
有一些很棒的扩展,但如果您想编写可移植的 c 代码,请尽量避免使用任何 GNU C
扩展。