Linux下C语言简单函数编译报错求助:引用参数语法问题
解决gcc编译交换函数时的引用语法错误问题
嘿,这个坑我之前也踩过!你遇到的问题核心原因特别明确:你写的是C++的引用语法,但Linux下的gcc默认是按照C语言规则来编译代码的。
Dev-C能正常跑是因为它默认把这类代码当作C处理(毕竟它对C++的支持更友好),但gcc不一样,它默认编译C程序,而C语言里根本没有「引用(&作为参数修饰符)」这个语法,所以编译器直接懵了,抛出一堆错误。
两种快速解决办法:
办法一:直接用C++编译器编译
不用改代码,把编译命令换成g++就行——这是专门处理C++代码的编译器,完全支持引用语法:
# 只编译生成目标文件 g++ -c prova.c # 直接生成可执行文件,运行时敲./prova即可 g++ prova.c -o prova
这样就和Dev-C++里的编译逻辑一致,代码原样就能跑。
办法二:改成C语言原生写法(用指针实现交换)
如果你非要用C语言模式编译,那把引用换成指针就搞定了——C语言里靠指针实现传址修改的效果,和C++引用的作用类似:
修改后的gesoo函数:
void gesoo(int *a, int *b){ int temp; temp = *a; *a = *b; *b = temp; }
同时调用的时候要传变量的地址:
gesoo(&a, &b);
别忘了在main函数前补上正确的函数声明:
void gesoo(int *a, int *b);
之后再用gcc编译就完全没问题了。
再帮你拆解下错误信息
你看编译器报的第一个错:
prova.c:4:16: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
void gesoo(int &, int &);
这就是gcc在C语言模式下,完全不认识int &这种写法,它以为你在参数列表里写错了符号,所以提示你应该加;、,或者)。后面的「隐式声明函数」警告,是因为前面的函数声明报错后,编译器没识别到gesoo的正确定义,所以在main里调用时就默认是隐式声明了。
内容的提问来源于stack exchange,提问作者Luigi Guerrera
相关产品推荐
相关产品推荐

