c++标准规定main函数必须为int main(int argc, char argv[])或int main(),void main()等属未定义行为;argv[0]为程序名,argv[argc]为nullptr;访问argv[i]前须检查argc>i;中文路径需shell引号包裹;windows宽字符支持需用wmain和wchar_t argv[]。

main函数签名必须是int main(int argc, char* argv[])或等价形式
argc和argv不是全局变量,也不是靠头文件引入的,它们只通过main函数参数传递。C++标准规定,只有这种签名(或int main()无参形式)才是合法的启动入口。写成void main()、int main(int argc, char** argv)(虽能编译但不推荐)、或漏掉argc都属于未定义行为,尤其在Linux/macOS下可能运行异常,在Windows某些编译器里侥幸通过,但移植性极差。
常见错误现象:./a.out hello运行后argv[1]显示乱码或空指针,往往是因为把argv误当成char**做了多级解引用,或没检查argc直接访问argv[1]导致越界。
- 务必用
int main(int argc, char* argv[])——这是最清晰、最符合习惯的写法 -
argv[0]是程序名(含路径),不一定只是文件名;argv[argc]保证为nullptr,可作遍历终止条件 - 使用前先判断
if (argc 再访问<code>argv[1],避免段错误
argv[i]是C风格字符串,不能直接赋给std::string而不考虑空指针
很多人写std::string arg = argv[1];后程序崩溃,原因在于:当用户没传参数时argv[1]是nullptr,而std::string构造函数对nullptr的行为是未定义的(GCC报错,Clang可能静默崩溃)。这不是编码风格问题,是硬性安全边界。
正确做法是显式判空:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
if (argc > 1) {
std::string arg(argv[1]); // 安全:已确保argv[1]非nullptr
}
- 不要依赖
argv内容“看起来像字符串”就跳过检查 - 如果要用
std::vector<:string></:string>存全部参数,建议从i = 1开始循环,跳过argv[0](除非你真需要程序名) -
char* argv[]中的每个元素都是以\0结尾的,所以可直接用于fopen、std::ifstream等需要C字符串的API
中文路径或带空格参数在Shell里要加引号,否则shell已拆分
很多人测试./app /home/user/我的文件.txt失败,以为是C++读取有问题,其实是Shell在调用程序前就把这个参数按空格切成了/home/user/我的文件.txt和文件.txt两段(因为中文“我的文件.txt”里有空格,且未加引号)。此时argc变成3,argv[1]是/home/user/我的文件.txt,argv[2]是文件.txt——根本不是你想要的。
- 正确调用方式:
./app "/home/user/我的文件.txt"或./app '/home/user/我的文件.txt' - Windows CMD下同理,双引号不可省略;PowerShell稍宽松,但仍建议统一加引号
- C++代码里永远不要假设
argv[i]不含空格——它可能来自任意用户输入,应全程按完整C字符串处理
argc和argv在Windows Unicode环境下需用wmain + wargv
如果程序需要原生支持中文路径(比如打开记事本.exe传入文档.txt),在Windows上用普通main会丢失宽字符信息:argv被ANSI编码转换过,遇到GBK/UTF-8混合环境极易乱码。这时必须改用宽字符入口。
启用方式分两步:
- 将
main改为int wmain(int argc, wchar_t* argv[]) - 链接时加上
/SUBSYSTEM:CONSOLE(MSVC默认),并确保源文件保存为UTF-8 with BOM或Unicode
注意:wchar_t*不能直接传给std::ifstream(C++标准库不支持),得用std::wifstream,或转成UTF-8再用std::string——这点容易被忽略,一上来就拿wargv[1]去开文件,结果is_open()返回false却查不出原因。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










