C语言程序编译时部分错误提示信息的含义及其解决方法

注:以下错误提示信息若用到变量、数组、结构体、函数名或其他类型,均用xxx指代。

1.error: called object 'xxx' isnot a function or function pointer

翻译:错误:所谓的对象xxx不是一个函数或函数指针。

含义:该行代码可能在xxx后直接用了圆括号。

错误代码:

int a[3]={1,2,3},b = 1,c;
c = a(b);

正确代码:

int a[3]={1,2,3},b = 1,c;
c = a[b];

2.error: stray '\357' in program

翻译:错误:程序中出现了“\357”。

含义:该行代码中可能含有中文字符(注释中的中文除外),例如中文格式的逗号、分号、括号等。

3. error: static declaration of 'xxx' follows non-static declaration|

翻译:错误:“xxx”的静态声明紧跟在非静态声明之后。

含义:调用了静态函数,但没有声明;也可能是在A函数内部定义了B函数,且在A内部做了B的函数声明,但此方式错误。正确方式是:在A函数之前做B的函数声明,或在A函数之前定义B,或在A函数外部定义B并在A函数之前做B的函数声明。

错误代码:

void example()
{
    int add(int x);
    int a = 5, b;
    b = add(a);

    int add(int x)
    {
        x++;
        return x;
    }
}

正确代码:

void example()
{
    int add(int x);
    int a = 5, b;
    b = add(a);
}
int add(int x)
{
    x++;
    return x;
}

4.warning:passing argument xxx of 'xxx' from incompatible pointer type [-Wincompatible-pointer-types]

翻译:警告:从不兼容的指针类型传递参数'xxx'。

含义:当想要以二维数组名为实参、以与数组元素同类型的指针为形参使用函数时,可能出现此警告。出现此警告时可能编译失败。设计这样的警告信息可能是考虑到指针的使用规范,因为二维数组名指代的是整个二维数组,而指针指向的是单个数组元素。注意,当以一维数组名作为函数实参时不会出现此警告信息。

解决方法:将二维数组名强制转换为指针,以传递相关地址(详见正确代码1);或者先将二维数组名强制转换为指针并赋值给对应类型的指针变量,然后以此指针变量为实参调用函数(详见正确代码2)。

示例:passing argument 1 of 'change' from incompatible pointer type [-Wincompatible-pointer-types].

错误代码:

#include <stdio.h>
#include <stdlib.h>
void change(int *p)
{
    ++p;
    *p = 24;
}
int main()
{
    int a[5][3]={4,2,5};
    change(a);
    printf("%d",a[0][1]);
    return 0;
}

正确代码1:

int main()
{
    int a[5][3]={4,2,5};
    change((int *)a);
    printf("%d",a[0][1]);
    return 0;
}

正确代码2:

int main()
{
    int a[5][3]={4,2,5},*q = (int *)a;
    change(q);
    printf("%d",a[0][1]);
    return 0;
}

5.其他注意事项

(1)编写主函数时尽量有返回值,不要使用void形式,否则即使无其他语法错误,部分编译器仍可能编译失败。

(2)使用Vscode时错误提示信息更新可能出现延迟,即程序之前出现的语法错误已经反正,但终端仍显示该处之前的语法错误未改正。如果确定该处代码无语法错误,可尝试运行或调试,则该处代码的错误提示信息很有可能消失。

注:此文章参考多方资料,同时结合本人编程实际经验,若有侵权,请联系修改或删除

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值