2014-05-05 109 views
1

以下是來自開源項目X264的代碼片段,當嘗試移植它以支持VS編譯器cl.exe時,出現構建錯誤。 cl.exe[X264_PULLDOWN_22]作爲lambda的開頭。因此,任何人都可以用C語言來解釋這一行的含義。爲什麼這段代碼通過編譯器並驗證代碼?

typedef struct 
{ 
    int mod; 
    uint8_t pattern[24]; 
    float fps_factor; 
} cli_pulldown_t; 

enum pulldown_type_e 
{ 
    X264_PULLDOWN_22 = 1, 
    X264_PULLDOWN_32, 
    X264_PULLDOWN_64, 
    X264_PULLDOWN_DOUBLE, 
    X264_PULLDOWN_TRIPLE, 
    X264_PULLDOWN_EURO 
}; 

#define TB PIC_STRUCT_TOP_BOTTOM 
#define BT PIC_STRUCT_BOTTOM_TOP 
#define TBT PIC_STRUCT_TOP_BOTTOM_TOP 
#define BTB PIC_STRUCT_BOTTOM_TOP_BOTTOM 

static const cli_pulldown_t pulldown_values[] = 
{ 
    /*WHAT DOES THIS LINE MEAN???, how can you assign to [X264_PULLDOWN_22]*/ 
    [X264_PULLDOWN_22]  = {1, {TB}, 1.0}, 
    [X264_PULLDOWN_32]  = {4, {TBT, BT, BTB, TB},      1.25}, 
    [X264_PULLDOWN_64]  = {2, {PIC_STRUCT_DOUBLE, PIC_STRUCT_TRIPLE}, 1.0}, 
    [X264_PULLDOWN_DOUBLE] = {1, {PIC_STRUCT_DOUBLE},     2.0}, 
    [X264_PULLDOWN_TRIPLE] = {1, {PIC_STRUCT_TRIPLE},     3.0}, 
    [X264_PULLDOWN_EURO] = {24, {TBT, BT, BT, BT, BT, BT, BT, BT, BT, BT, BT, BT, 
            BTB, TB, TB, TB, TB, TB, TB, TB, TB, TB, TB, TB}, 25.0/24.0} 
}; 
+3

這是一種形式的[指定的初始值](http://stackoverflow.com/q/763763/912144) 。 – Shahbaz

+0

它沒有分配給X264_PULLDOWN_22,它創建一個cli_pulldown_t的靜態數組,並將索引X264_PULLDOWN_22設置爲{1,{TB},1.0} – paulm

+0

將該文件重命名爲.c,並使用VS 2013對其進行編譯。 Microsoft僅在2013年才增加對C99構造的支持。 – dasblinkenlight

回答

3

這就是所謂的指定初始值設定項。你可以閱讀更多關於它here

+3

值得補充的是,雖然您鏈接到GCC文檔,但它不是GCC擴展,自1999年以來它已成爲標準C的一部分。 – hvd

1

其他人都說過這是什麼。用C編譯器編譯,而不是C++,應該修復它,因爲它不是C++的標準部分。

1

它被稱爲指定初始值設定項,是初始化變量的簡寫方法。

如何解決你的問題編譯:

設置編譯器complience到C99或更高版本。

更改初始化初始化數組的所有元素:

static const cli_pulldown_t pulldown_values[] = 
{ 
    {0, NULL, 0.0}, // Added initializer for element 0 
    {1, {TB}, 1.0}, 
    {4, {TBT, BT, BTB, TB},      1.25}, 
    {2, {PIC_STRUCT_DOUBLE, PIC_STRUCT_TRIPLE}, 1.0}, 
    {1, {PIC_STRUCT_DOUBLE},     2.0}, 
    {1, {PIC_STRUCT_TRIPLE},     3.0}, 
    {24, {TBT, BT, BT, BT, BT, BT, BT, BT, BT, BT, BT, BT, 
      BTB, TB, TB, TB, TB, TB, TB, TB, TB, TB, TB, TB}, 25.0/24.0} 
};