2016-05-02 20 views
1

我试图推行“标签的价值”的价值观(https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html)使用铛3.7在Visual Studio 2015年标签是铛

作为一个玩具示例性交流计划,我有以下代码会导致编译编译器文件'c:\ agent \ build \ cache \ git \ vctools \ vctools \ compiler \ utc \ src \ p2 \ main编译器文件'c:\ agent \ build \ cache \ git \ .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}; 

任何人都可以提供一个像上面那个应该工作的例子吗?这是铿锵声或Visual Studio的“codegen”方面的问题吗?

我觉得这个bug是相关的,但我不知道: https://connect.microsoft.com/VisualStudio/feedback/details/2103400/crash-in-clang-c2-with-address-of-label-extension

+0

这是可怕的编码风格。你为什么不使用'switch'或函数表。如果你真的想要这样的代码,你应该'goto' 70ies/80ies BASIC。 – Olaf

回答

0

构建应该工作的例子,我只是验证它使用Apple LLVM version 7.0.2 (clang-700.1.81)

上述错误报告似乎报告了这个非常相同的问题,直到它解决了,除了试图不使用扩展之外,您无法做任何事情。

虽然GNU C有一些很好的扩展,如果你想写便携代码,尽量避免使用任何GNU C扩展名。

+0

感谢您的信息。希望在Visual Studio中使用clang,我将能够获得可移植的代码。 – Jimbo

+1

@Jimbo可以使用LLng而不是C2作为后端。这似乎工作(我用[这里](http://llvm.org/builds/)的r265934版本,但任何稳定版本可能也适用)。 – cremno

+0

@cremno工作很好,谢谢!我不知道铿锵与C2(或C2是什么)合作。整个叮当与llvm的事情(即这些不同)现在是有道理的。 – Jimbo

-1

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

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

'clang'确实拥有大部分的GNU扩展,并且还定义了'__GNUC__'宏。 – Leandros

+0

我会说原始文章​​中的错误链接回答问题,然后。这是一个已知的错误,直到错误得到解决,它才会起作用。 – Jfevold

+0

是的,但仍然是,您的答案是错误的。 'clang'确定了'__GNUC__'并且有扩展名。 – Leandros