2014-10-29 3 views
0

nb: Этот вопрос был уменьшен много раз, из-за комментариев. Ниже приведено минимальное количество кода, сгенерировавшего ошибку. Файл inttypes.h был загружен отсюда: ffMPEG "inttypes.h not found" error), который считался проблемой в начале.inttypes.h header issue

//tlvlist.c 

static int32_t test(somestruct *a); 

/* Private method, adds tlv object to the list which contains raw binary data. */ 
int32_t int32_t test(somestruct *a) 
{ 
    /* Some checks */ 
    if(a == NULL || bytes == NULL) 
     return -1; 

    /* Check if list is full */ 
    if(a->used == MAX_LIST_SIZE) 
     return -1; 

    /* Index to first free element in the list */ 
    int iIndex = a->used; 

    // ... 

    return 0; 
} 

ошибки:

tlvlist.c 
c:\users\documents\visual studio 2012\projects\tlv list\tlv list\tlvlist.c(21): error C2143: syntax error : missing ';' before 'type' 
c:\users\documents\visual studio 2012\projects\tlv list\tlv list\tlvlist.c(23): error C2065: 'iIndex' : undeclared identifier 
c:\users\documents\visual studio 2012\projects\tlv list\tlv list\tlvlist.c(24): error C2065: 'iIndex' : undeclared identifier 
c:\users\documents\visual studio 2012\projects\tlv list\tlv list\tlvlist.c(28): error C2065: 'iIndex' : undeclared identifier 
c:\users\documents\visual studio 2012\projects\tlv list\tlv list\tlvlist.c(29): error C2065: 'iIndex' : undeclared identifier 
c:\users\documents\visual studio 2012\projects\tlv list\tlv list\tlvlist.c(32): error C2065: 'iIndex' : undeclared identifier 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+1

Невозможно сообщить, не установив код, вызывающий ошибку. Попробуйте уменьшить 'tlvlist.c' до * small * подмножества, которое обнаруживает проблему, и включить исходный файл в ваш вопрос. –

+0

@KeithThompson: пожалуйста, посмотрите, если это помогает –

+0

'' - это надмножество '', и вы, кажется, не используете ничего, что не находится в '' (что, по-видимому, доступно). Вы уверены, что вам нужно ''? –

ответ

0

Очевидно, что при компиляции файла C в МСВС вам нужно иметь все объявления переменных в начале функции до любого оператора. Например:

int32_t Tlvlist_AddRawt(Tlvlist *a, uint8_t type, uint16_t size, const void *bytes) 
{ 
    /* Index to first free element in the list */ 
    int iIndex; 

    /* Some checks */ 
    if(a == NULL || bytes == NULL) 
     return -1; 

    iIndex = a->used; 

    ... 
} 

Я считаю, что это старый формат C89 и большинство компиляторов C теперь используют C99 (или выше), которая позволила бы объявления переменных в любой точке функции. Переименование файла в качестве CPP является еще одним вариантом для MSVS, не перемещая объявления переменных в начало функции, хотя это может вызвать другие проблемы в коде.

+0

Это именно проблема; C добавила возможность смешивать объявления и заявления в 1999 году, но Microsoft не реализует стандарт C99 (или C11). –

+0

Ваш исходный код/​​вопрос имел несоответствующий вывод ошибки и код, который сделал его намного сложнее для диагностики. Идеальный вопрос SO имеет короткий примерный код и точный вывод ошибки, который вы получаете от этого кода. Это делает тривиальным для кого-то копировать/вставлять/компилировать и подсчитывать строки, чтобы соответствовать ошибкам с кодом. – uesp

+0

@ pseudonym27: Нисходящий голос был моим, потому что вопрос в то время был многословным и запутанным. Объяснение несоответствий линий не было на мой взгляд достаточным; вы должны * скорректировать их. Текущая версия в некотором смысле лучше (спасибо за это), но сообщения об ошибках * все еще не совпадают с опубликованным источником, а образец кода теперь * меньше *, чем минимальный (он не '# include' необходим заголовки). –