2016-07-18 3 views
2

Я пытаюсь обнаружить ошибку, поэтому включил в свою программу некоторые следы. Проблема заключается в том, что после этого, он не компилируется, дает мне следующую ошибку:Ошибка компиляции: Fprintf throws parse error

../src/DR700_API.c:46: parse error before `*' 

Я просто добавил fprintf в начале каждой функции:

fprintf(stdout,"_name_of_function_"); 

Комментируя все fprintf компилирует правильно, так что есть ошибка. Я не могу отказаться от них, так как хочу отслеживать другую ошибку во время выполнения.

Вот небольшой пример:

#include <stdio.h>                               
#include <stdlib.h> 

ImprFunc *DR700_new()                              
{                                   
    fprintf(stdout,"DR700_new");                           
    ImprFunc *impr = (ImprFunc *)malloc(sizeof(DR700_ImprFunc));                    
    if (impr == NULL)                              
     return NULL; 
... 


../src/DR700_API.c:46: parse error before `*' 
../src/DR700_API.c:47: `impr' undeclared (first use in this function) 
../src/DR700_API.c:47: (Each undeclared identifier is reported only once 
../src/DR700_API.c:47: for each function it appears in.) 
make: *** [../obj/DR700_API.o] Error 1 

ответ

2

Возможно, ваша установка не допускает смешанный код и заявления (в соответствии с C89). Если вы хотите не влиять на настройку проекта, попробуйте сохранить декларации перед любым кодом. В вашем примере это означает

ImprFunc *impr = (ImprFunc *)malloc(sizeof(DR700_ImprFunc)); 
fprintf(stdout,"DR700_new"); 

вместо

fprintf(stdout,"DR700_new"); 
ImprFunc *impr = (ImprFunc *)malloc(sizeof(DR700_ImprFunc)); 

Или же - добавить -std=c99 (как было упомянуто в комментариях).

+1

или добавить -std = c99 в флаговые сборки. Но для нового gcc он не является фактическим, поскольку он использует -std = c11 по умолчанию – alexanius

+0

Я сделал это первым способом, и он работал нормально. Большое спасибо! – Joster

2

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

C99 позволяет смешать объявления и заявления произвольно (например, см. Variable declaration placement in C и Where can I legally declare a variable in C99?).

Вы можете попробовать скомпилировать с --std=c99/--std=c11, которая позволит вам объявлять переменные в любом месте (если поддерживается в версии GCC. См Status of C99 features in GCC и C11Status).

C99, по большей части, обратно совместим с C89.

+0

Спасибо, в этом была проблема. – Joster