2014-11-12 1 views
0

файла Я использую в моем проекте есть много декларации в этом стиле:C++ необъявленных переменных

static VALUE do_checksum(int, VALUE*, uLong (*)(uLong, const Bytef*, uInt)); 
... 
static VALUE 
do_checksum(argc, argv, func) 
    int argc; 
    VALUE *argv; 
    uLong (*func)(uLong, const Bytef*, uInt); 
{ 
    ... 
} 

В то время как я никогда не писал код, таким образом, сам, я уверен, что это правильно. Однако мой компилятор возвращает

error: 'VALUE do_checksum' redeclared as different kind of symbol 
error: 'argc' was not declared in this scope 

Что здесь не так?

Windows 7

Code :: Blocks ж/MinGW

+3

C++ не поддерживает C декларации параметров в старом стиле , –

+0

@JonathanPotter: это * старомодные декларации параметров C. Современный C все еще разрешает их, но с 1989 года они официально устарели. –

+0

См. Http://stackoverflow.com/questions/1585390/c-function-syntax-parameter-types-declared-after-parameter-list для обсуждения , –

ответ

0

Вы себя несколько объявлений список параметров C в старом стиле.

Вот пример исправления:

static VALUE do_checksum(
    int argc, 
    VALUE *argv, 
    uLong (*func)(uLong, const Bytef*, uInt) 
    ) 
{ 
    ... 
} 

еще лучше исправить было бы сделать типа псевдоним для func так:

using func_ptr_type = uLong (*)(uLong, const Bytef*, uInt); 
+0

Итак, следуя вашему образцу, я просто покончу с «статическим VALUE do_checksum (int, VALUE *, uLong (*) (uLong, const Bytef *, uInt)); полностью? – chrisvj

+0

@chrisvj, нет, выглядит более внимательно. Вам нужно переместить объявления параметров внутри() и заменить запятые полуколониями –

+0

Насколько мне известно, код, который вы используете, нуждается в нем (его декларация вперед и эллипсы подразумевают материал после него). – defube

Смежные вопросы