函数声明应写在调用前:单文件放main上方,多文件放头文件并#include;参数传递依是否修改和数据大小选择值、const引用或非const引用;声明与定义必须字面一致,否则编译失败。

函数声明写在哪?头文件还是源文件?
函数声明必须出现在调用它的代码之前,否则编译器不认识这个函数名。常见错误是把声明放在 main() 后面,结果报错 ‘xxx’ was not declared in this scope。
- 如果只在单个
.cpp文件里用,声明直接写在main()上方就行 - 如果多个源文件都要用(比如
utils.cpp和main.cpp),声明必须放进头文件(如utils.h),并在每个用到的地方#include "utils.h" - 别在头文件里写函数定义(除非是
inline或模板),否则链接时可能报multiple definition
参数传值、传引用、传指针怎么选?
选错参数传递方式,轻则性能差,重则逻辑出错或崩溃。核心判断依据:要不要改原变量?数据大不大?
- 只读小对象(
int、char、double):直接传值,最安全 - 只读大对象(
std::string、std::vector):用const std::string&,避免拷贝开销 - 要修改原变量:用
std::string&(非 const 引用),别用指针——除非你真需要空值语义(nullptr) - 别对内置类型(如
int)滥用引用,没好处还容易误导
函数定义和声明不一致会怎样?
编译器不会自动帮你对齐,哪怕只差一个 const 或一个 &,就会变成两个不同函数,或者直接报错。
- 典型错误:
void foo(int x);声明了,但定义写成void foo(const int x) { ... }—— 这不算重定义,但调用时行为不变;而如果声明是void foo(int& x);,定义却写void foo(int x),编译直接失败 - 返回类型也必须严格一致,
int和long在某些平台不是一回事 - 建议用 IDE 的“跳转到定义”功能核对,比肉眼检查靠谱
为什么调用时加括号却报错“expected primary-expression”?
这通常不是函数调用问题,而是你把函数名当变量用了,比如忘了加括号,或括号位置错了。
立即学习“C++免费学习笔记(深入)”;
- 错误写法:
int result = my_func;—— 这是在取函数地址,不是调用,类型是函数指针,不能直接赋给int - 正确写法:
int result = my_func();(无参)或int result = my_func(42);(有参) - 如果函数名带默认参数,仍需写括号,
my_func不等于my_func();前者是函数名(可取地址),后者才是调用表达式 - 宏定义和函数同名也会干扰,比如
#define max(a,b) ((a)>(b)?(a):(b))之后再写max(1,2),实际走的是宏展开,不是函数调用
最容易被忽略的其实是声明和定义的参数顺序、cv 限定符、引用符号是否完全镜像匹配——编译器不提醒你“差不多”,只认字面一致。多一个空格都不会放过。










