编译错误:Fprintf抛出解析错误

时间:2016-07-18 08:39:31

标签: c linux gcc makefile compilation

我正在尝试检测错误,因此我在程序中包含了一些痕迹。 问题是,在那之后,它不会编译,给我下一个错误:

../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 个答案:

答案 0 :(得分: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 :(得分:2)

在C的早期版本中,必须在块的开头声明变量。

C99允许任意混合声明和语句(例如,请参阅Variable declaration placement in CWhere can I legally declare a variable in C99?)。

您可以尝试使用--std=c99 / --std=c11进行编译,这样您就可以在任何地方声明变量(如果您的gcc版本支持。请参阅Status of C99 features in GCCC11Status)。

C99在很大程度上与C89向后兼容。