注:以下错误提示信息若用到变量、数组、结构体、函数名或其他类型,均用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时错误提示信息更新可能出现延迟,即程序之前出现的语法错误已经反正,但终端仍显示该处之前的语法错误未改正。如果确定该处代码无语法错误,可尝试运行或调试,则该处代码的错误提示信息很有可能消失。
注:此文章参考多方资料,同时结合本人编程实际经验,若有侵权,请联系修改或删除。