2016-05-02 27 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