__argv[0] 使用方法

本文介绍了C语言中main函数的两种常见写法及其参数意义。详细解释了int argc和char *argv[]如何用于接收程序启动时的命令行参数,并展示了如何通过__argc和__argv获取程序的完整路径。
我们对C语言中main函数这样的写法应该不会陌生:

int main(int argc, char *argv[])
{
......
}
这是UNIX和Linux中的标准写法。int argc, char *argv[] 表示程序运行的环境变量。int argc表示环境变量的个数,char *argv[] 为存储具体环境变量的字符串指针数组。使用命令行窗口运行程序时,为程序输入多个参数,程序可以调用多个参数实现特定功能。
当然,我们也可以使用main函数默认的调用方式:

int main()
{
......    
}
这种方式就没有环境变量。


然后我们来讲讲 __argv[]。

我们先写一个Win32 Console Application, 在Debug模式下,在main()函数入口处设一个断点,运行程序。程序在断点停止后,我们查看调用堆栈(context),发现在运行到main()函数之前,调用堆栈内还有两个函数。最底层的是KERNEL!********()应该是操作系统调用的开始,然后是mainCRTStartup()。我们要讨论的__argv还有另一个参数__argc就在mainCRTStartup()中定义和分配内存空间的。
在我们的main()函数里,可以像使用argc和argv一样地用__argc和__argv。在默认情况下,__argc等于1,__argv[0]存放着程序文件的完全路径。
所以我们用__argv[0]来获取可执行程序的路径,比用其他方式方便的多。

示例代码:
  1. #include <afx.h>
  2. int main()
  3. {
  4.     printf("/n/n%d, %s/n/n", __argc, __argv[0]);
  5.     return 0;
  6. }
运行结果:




参考:
<think> 我们分析用户提供的代码片段:`int main(int argc, wchar_t *argv[]) {` 这是一个C/C++程序的主函数声明。通常,主函数的标准形式有两种: 1. `int main(int argc, char *argv[])` 或 `int main(int argc, char** argv)` 2. `int main()` 但是这里出现的是 `wchar_t *argv[]`,这并不常见。 问题分析: 1. 标准规定:主函数的第二个参数应该是 `char* argv[]` 或等价的 `char** argv`,表示一个指向字符串(窄字符)指针数组的指针,每个字符串是一个参数。 2. 而这里使用了 `wchar_t *argv[]`,即宽字符版本的参数数组。这不符合C/C++标准中主函数的定义。 因此,这段代码可能存在的问题: - 语法错误:根据C/C++标准,主函数的参数必须是 `char**` 类型(或等价的),使用 `wchar_t**` 是不被允许的。编译器会报错。 - 可移植性问题:即使某些编译器扩展支持宽字符的主函数参数(例如Windows系统可能有这样的扩展),但这样的代码在非Windows平台或某些编译器上无法编译。 在Windows系统中,实际上提供了另一个入口点 `wmain` 来支持宽字符参数: `int wmain(int argc, wchar_t *argv[])` 因此,如果用户想要使用宽字符的命令行参数,应该将 `main` 改为 `wmain`。 另外,还有一种方式是使用 `main` 函数,但在程序内部将命令行参数从窄字符转换为宽字符。或者,在支持Unicode的Windows程序中,可以使用`GetCommandLineW`函数来获取宽字符命令行字符串,然后使用`CommandLineToArgvW`解析。 所以,用户提供的代码片段中,使用 `main` 函数但第二个参数为 `wchar_t* argv[]` 是错误的。 总结: 1. 如果要使用宽字符命令行参数,在Windows下应使用 `wmain` 而不是 `main`。 2. 标准C++程序的主函数应使用 `char**` 类型的参数。 因此,正确的写法应该是: - 标准窄字符版本:`int main(int argc, char* argv[])` - 或者宽字符版本(Windows特定):`int wmain(int argc, wchar_t* argv[])` 如果用户坚持要在main函数中使用宽字符,那么编译器会报错,因为标准不允许。 引用用户提供的参考中并没有直接相关的代码,但引用[1]中使用了`wchar_t`类型的字符串,并调用了`setlocale`函数来设置本地化环境,这说明了在程序中处理宽字符是可行的,但主函数的参数必须遵循标准。 所以,用户需要将代码改为标准形式,或者使用`wmain`(如果目标平台是Windows且编译器支持)。 注意:在跨平台程序中,应避免使用`wmain`。 生成相关问题: 1. 如何正确使用宽字符的命令行参数? 2. 在Windows程序中使用宽字符有哪些方法? 3. 如何将命令行参数从窄字符转换为宽字符? 4. C++中主函数的标准形式有哪些? 5. 如何编写跨平台的命令行参数处理代码? </think>### 分析代码 `int main(int argc, wchar_t *argv[]) {` #### 问题分析 1. **参数类型错误** 标准C/C++要求`main`函数的第二个参数必须是`char* argv[]`(窄字符指针数组),而您使用了`wchar_t* argv[]`(宽字符指针数组)。这会导致编译错误,因为编译器找不到匹配的主函数签名。 **正确形式**:`int main(int argc, char* argv[])`(窄字符版本) **或替代方案**:如需宽字符参数,应改用Windows特有的`wmain`函数: ```cpp int wmain(int argc, wchar_t* argv[]) // Windows专用宽字符入口 ``` 2. **跨平台兼容性问题** 宽字符命令行参数 (`wchar_t* argv[]`) 是Windows特有的扩展。在Linux/macOS等POSIX系统中,命令行参数始终以窄字符(`char*`)传递,此代码无法编译。 3. **宽字符处理要求** 若需处理宽字符参数(如含中文路径),必须在程序中显式进行字符集转换: ```cpp #include <locale> setlocale(LC_ALL, ""); // 设置本地化环境[^1] ``` #### 代码含义 - `int argc`:命令行参数数量(包括程序自身名称)。 - `wchar_t* argv[]`:**意图**接收宽字符命令行参数的数组(但语法错误)。 例如执行`程序.exe "文件.txt"`时: - `argc = 2` - `argv[0] = "程序.exe"`, `argv[1] = "文件.txt"`(宽字符形式) #### 修正建议 === "跨平台方案" ```cpp #include <cstdlib> int main(int argc, char* argv[]) { // 手动转换窄字符参数为宽字符(如需) wchar_t** wargv = new wchar_t*[argc]; for(int i=0; i<argc; ++i) { size_t len = mbstowcs(nullptr, argv[i], 0) + 1; wargv[i] = new wchar_t[len]; mbstowcs(wargv[i], argv[i], len); } // 使用wargv处理宽字符... } ``` === "Windows专用方案" ```cpp #include <windows.h> int wmain(int argc, wchar_t* argv[]) { // ✅ 正确宽字符入口 // 直接使用argv处理中文路径等 MessageBoxW(NULL, argv[1], L"参数", MB_OK); } ``` #### 关键注意事项 1. 宽字符处理需配套使用宽字符API: ```cpp wprintf(L"参数: %ls\n", argv[1]); // 使用%ls打印宽字符串 ``` 2. 在Windows中编译时需指定字符集: - MSVC编译器添加`/D_UNICODE /DUNICODE` - GCC/MinGW添加`-municode`
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值