2011-08-15 36 views
8

如何獲得GCC中的-fplan9-extensions在Clang中工作的匿名結構/聯合行爲?等同於Clang中的-fplan9擴展?

我在使用指定的初始值設定項時給匿名成員分配錯誤,而且我沒有將自由角色轉換爲匿名成員的類型。這兩個工作都在GCC的情況下啓動了上述擴展。

typedef struct {int hi;} Embedded; 
typedef struct {Embedded;} Encapsulating; 

Encapsulating poo = {.hi = 3;}; 
error: field designator 'hi' does not refer to any field in type 'Encapsulating' 

void takes_embedded(Embedded *m); 
takes_embedded(&poo); 
warning: incompatible pointer types passing 'Encapsuating *' to parameter of type 'Embedded *' 
+1

我認爲最好不要編寫無效的代碼C. –

+1

您不能使用特定於編譯器的擴展,然後詢問「它是如何在其他編譯器上不起作用的?」你需要堅持使用GCC或者將你的代碼重寫爲標準C. –

+0

@Chris Lutz:我的印象是,clang的目標是成爲GCC的一個主要替代品。它當然接受這個選項,但對此沒有任何關係。 –

回答

8

下面是如何在鏘得到-fplan9-extensions功能:

  • 確保功能滿足seven criteria for Clang extensions
  • 郵寄cfe-dev郵件列表,詢問Clang社區是否接受實施此擴展的修補程序。
  • 熟悉LLVM coding standards
  • Check out and build來自SVN的LLVM和clang。
  • 製作一個修補程序來實現該功能,並將其發送到cfe-commits郵件列表。
  • 迴應該郵件列表上的評論。對於Clang的第一個補丁,您應該預計需要在被社區接受之前多次修改它。耐心和堅持。
  • 如果一切順利,您的補丁將被檢入到Clang中。

一些-fplan9-extensions功能(在struct { Embedded; }部分)是-fms-extensions參數下已經上市,但不支持這樣的匿名成員指定初始化。另一部分在精神上類似於Clang已經支持的GCC的__attribute__((transparent_union))功能。

+0

https://33.media.tumblr.com/123e96b4d3019a8b697ca596c07569b0/tumblr_nw52vgYiIN1rz6w0do1_500.gif –