2014-04-13 19 views
2

我使用Visual C++ Express 2008的嘗試編譯代碼類似於下面:爲什麼非指針型鑄造結構會給出語法錯誤

沒有問題

{ 
    ... 
    AVRational test = {1, 1000}; 
    ... 
} 

有問題當它是如下圖所示:

{ 
    ... 
    AVRational test = (AVRational){1, 1000}; 
    ... 
} 

給了錯誤:

1>..\..\..\projects\test\xyz.cpp(1139) : error C2059: syntax error : '{' 
1>..\..\..\projects\test\xyz.cpp(1139) : error C2143: syntax error : missing ';' before '{' 
1>..\..\..\projects\test\xyz.cpp(1139) : error C2143: syntax error : missing ';' before '}' 

其中AVRational(ffmpeg.org庫)定義爲:

typedef struct AVRational{ 
    int num; ///< numerator 
    int den; ///< denominator 
} AVRational; 

FFmpeg的配有一些預先限定的值,如

#define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE} 

其用作下面

av_rescale_q(seek_target, AV_TIME_BASE_Q, pFormatCtx->streams[stream_index]->time_base); 

將無法​​在Visual C++ express 2008上編譯

看起來好像在gcc編譯器上編譯沒有錯誤/警告的代碼一樣。爲什麼我在VC++上遇到這個錯誤?它是一種C/C++標準方式來對結構值進行強制轉換嗎?無論如何,我可以避免這個錯誤,同時仍然可以使用定義的AV_TIME_BASE_Q?

+0

嘗試圍繞你的{}與()...我已經看到在其他情況下的工作。 – HypnoToad

+0

你的意思是做這樣的事情「av_rescale_q(seek_target,(AV_TIME_BASE_Q),pFormatCtx-> streams [stream_index] - > time_base);」?不工作。出現類似的錯誤。 –

+5

'AVRational test =(AVRational){1,1000};'是無效的C++。這是一個名爲「複合文字」的C99特性,gcc支持它作爲擴展。 – Brian

回答

2

VC++ 2013不允許用C複合文字++,但它允許他們在C選項:

  1. 與.c後綴重命名你的程序
  2. 接通/ TC標誌,做節目不編譯。

如果要保持到C++另一種方法是改變AV_TIME_BASE_Q的聲明在頭文件

static const AVRational AV_TIME_BASE_Q = {1, AV_TIME_BASE}; 

然後將使用代替化合物字面常數。

+0

你是對的。通過右鍵單擊項目 - >屬性 - >配置屬性 - > C/C++ - >高級 - >編譯爲 - >使用/ TC選項而不是默認選項,那麼代碼將被成功編譯。在VC++上表達了2013年。謝謝。 –