You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 07:49:06