【问题标题】:Compilation Error: Fprintf throws parse error编译错误:Fprintf 抛出解析错误
【发布时间】:2016-07-18 08:39:31
【问题描述】:

我正在尝试检测错误,因此我在我的程序中包含了一些跟踪。 问题是在那之后,它没有编译,给我下一个错误:

../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

【问题讨论】:

    标签: c linux gcc makefile compilation


    【解决方案1】:

    可能您的设置不允许混合代码和声明(根据 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(如 cmets 中所述)。

    【讨论】:

    • 或将 -std=c99 添加到构建标志中。但是对于新的 gcc 它并不实际,因为它默认使用 -std=c11
    • 我用了第一种方法,效果很好。非常感谢!
    【解决方案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。

    【讨论】:

    • 谢谢,这就是问题所在。
    猜你喜欢
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2020-12-18
    • 2017-07-15
    • 1970-01-01
    相关资源
    最近更新 更多