2015-10-21 3 views
3

У меня есть ошибка C4576 в Visual studio 2015, когда я попытался скомпилировать файл: transcoding.c.Ошибка C4576 в VS2015 предприятие

Исходный код этого файла здесь: transcoding.c

ошибка C4576: в круглых скобках типа с последующим списком инициализатора является нестандартный синтаксис явного преобразования

Ошибка возникает при строка 127 в этой инструкции:

enc_ctx->time_base = (AVRational) { 1, enc_ctx->sample_rate }; 

Я использовал источник FFmpeg в моем проекте https://www.ffmpeg.org/download.html

Я искал вокруг для решения, но я не могу исправить ошибку

Если кто-то нашел что-то подобное, пожалуйста, дают представление

+2

Это соединение буквальным. Вы должны использовать компилятор C99 или C11; MSVC не является стандартным и не должен использоваться для современного кода C. И это только C-только. – Olaf

+0

@HocineDJEMAI: Нет проблем, мы исправили пометку. – MSalters

+1

@Olaf it * is * standard compliant, только проблема соответствует стандарту, которому он соответствует, составляет более 25 лет: D –

ответ

3

Несмотря на то, что некоторые другие ответы неверно утверждают, VS2015-компилятор обеспечивает всестороннюю поддержку функций C99, включая составной литерал, который вы пытаетесь использовать в этой проблемной строке.

Одним из возможных объяснений сообщения об ошибке является то, что исходный файл, несмотря на то, что он назван как файл .c, скомпилирован как файл на C++. Параметры проекта могут явно запрашивать компилятор C++ для этого файла. В C++ этот код недействителен.

Проверьте свои настройки компиляции, чтобы увидеть, может ли он случайно включить переключатель /TP («скомпилировать как C++»).

+0

Ok Я использовал файл Source.cpp, как было предложено VS2015, и я вставил содержимое transcoding.c внутри Source.cpp – HDJEMAI

+0

@Hocine DJEMAI: Ну, тогда это корень проблемы. C и C++ - это два очень разных языка, вы знаете. Попытка скомпилировать C-код как C++, как ожидается, приведет к проблемам. Это именно то, что вы наблюдали. Ваш код написан на C. Скомпилируйте его как C, а не как C++. – AnT

+0

В VS нет проекта C, поэтому я пробовал это, как правило, он работает каждый раз, когда я обрабатываю код C – HDJEMAI

1

выглядит как вопрос, где С и С ++ теги иметь смысл. Вы пытаетесь скомпилировать код C99 с помощью компилятора C++. Это не работает.

+0

есть ли возможность компиляции с C99 с помощью компилятора VS2015? – HDJEMAI

+0

@HocineDJEMAI Я так не думаю. Ваши варианты - C89 или C++. (В качестве альтернативы, отредактируйте данный код, чтобы не использовать синтаксис C99.Для этого конкретного случая это должно быть простым) – immibis

+1

Uhm, msvc может скомпилировать C (он решает по умолчанию на основе имени входного файла), и я недавно что-то прочитал о [ тег: c99], но не помню, где ... –

-1

«Ошибка» здесь является компилятором Microsoft C. Здесь вы видите compound literal. Это было ново в . Компилятор Microsoft C значительно отстает, и только один стандарт C полностью поддерживается , который еще не знал этого синтаксиса.

Что делать? Получите достойный компилятор C. Для Windows mingw-w64 - это, например, хороший выбор ... это по существу gcc, поэтому он бесплатный. Есть даже плагины для visual studio, если вы хотите его интегрировать.

+2

Неверный ответ. Компилятор Microsoft C поддерживает практически все основные функции языка C99, так как довольно давно. Поддерживаются сложные литералы. – AnT

+0

@AnT источник пожалуйста. Я помню, что читал что-то о соблюдении C99 в * самой новой версии *. (кстати, большое достижение) –

+2

http://stackoverflow.com/questions/27826409/what-is-the-official-status-of-c99-support-in-vs2013. Реальность - источник - вы можете скачать компилятор и попробовать. На стороне основного языка все поддерживается, за исключением 'ограничения' (поддержка является частичной) и VLA. – AnT

3

Старый вопрос, но ... Решение довольно простое:

AVRational tb; 
tb.num = 1; 
tb.den = enc_ctx->sample_rate; 

enc_ctx->time_base = tb; 

или

enc_ctx->time_base.num = 1; 
enc_ctx->time_base.den = enc_ctx->sample_rate; 
Смежные вопросы