如何解决无法在 C/C++ 中将 TCHAR 作为参数传递
我是一个笨手笨脚的菜鸟。
过去 13 个小时我一直在尝试解决这个问题(现在我的大脑受伤了)
这是缩小代码(完整代码太大,无法放在这里):-
#include <stdio.h>
#include <Windows.h>
using namespace std;
void myFunc(TCHAR Path)
{
printf("pathLen : %lu\n",sizeof(Path));
printf("character size : %lu\n",sizeof(*Path));
printf("pathLenInBytes : %lu\n",sizeof(Path) * sizeof(*Path));
}
int main()
{
TCHAR selfPath[MAX_PATH];
if (GetModuleFileName(NULL,selfPath,MAX_PATH) == 0) // Getting exe File Location
printf("Error : %lu\n",GetLastError());
printf("Self Path : %s\n",selfPath);
myFunc(selfPath);
return 0;
}
这是 MinGW-W64 编译器的错误输出:-
g++ -Os -s -o goga.exe tesst.cpp
tesst.cpp: In function 'void myFunc(LPCSTR,TCHAR)':
tesst.cpp:9:43: error: invalid type argument of unary '*' (have 'TCHAR' {aka 'char'})
9 | printf("character size : %lu\n",sizeof(*Path));
| ^~~~
tesst.cpp:10:35: error: 'pathLen' was not declared in this scope
10 | printf("pathLenInBytes : %lu\n",pathLen * sizeof(*Path));
| ^~~~~~~
tesst.cpp:10:53: error: invalid type argument of unary '*' (have 'TCHAR' {aka 'char'})
10 | printf("pathLenInBytes : %lu\n",pathLen * sizeof(*Path));
| ^~~~
tesst.cpp: In function 'int main()':
tesst.cpp:23:22: error: invalid conversion from 'TCHAR*' {aka 'char*'} to 'TCHAR' {aka 'char'} [-fpermissive]
23 | myFunc("AppBroker",selfPath);
| ^~~~~~~~
| |
| TCHAR* {aka char*}
tesst.cpp:6:32: note: initializing argument 2 of 'void myFunc(LPCSTR,TCHAR)'
6 | void myFunc(LPCSTR Name,TCHAR Path)
| ~~~~~~^~~~
但是如果我将 GetModuleFineName() 直接放在 myFunc() 中,那么它就可以工作:-
#include <stdio.h>
#include <Windows.h>
using namespace std;
void myFunc()
{
TCHAR selfPath[MAX_PATH];
if (GetModuleFileName(NULL,selfPath);
printf("pathLen : %lu\n",sizeof(selfPath));
printf("character size : %lu\n",sizeof(*selfPath));
printf("pathLenInBytes : %lu\n",sizeof(selfPath) * sizeof(*selfPath));
}
int main()
{
myFunc();
return 0;
}
但我不需要这样。我该如何解决这个错误?
编辑: 尝试用 myFunc(TCHAR Path)
和 myFunc(TCHAR *Path)
替换 myFunc(TCHAR Path[])
。工作和程序都编译成功,但输出与现在预期的输出不同!
预期输出:-
Self Path : C:\Users\username\Desktop\Coding\PETS\muse\goga.exe
pathLen : 260
character size : 1
pathLenInBytes : 260
我得到的输出:-
Self Path : C:\Users\username\Desktop\Coding\PETS\muse\goga.exe
pathLen : 8
character size : 1
pathLenInBytes : 8
解决方法
我试着回答
在您的第一个版本中,您的原型必须是
myFunc(TCHAR *Path)
或 myFunc(TCHAR Path[])
因为路径是 TCHAR 数组,因此 TCHAR*
(可以在 here 或 here 中找到起始文档)
您从编译的第一个代码中获得的只是您所要求的。 让我们看看:
printf("pathLen : %lu\n",sizeof(Path));
printf("character size : %lu\n",sizeof(*Path));
printf("pathLenInBytes : %lu\n",sizeof(Path) * sizeof(*Path));
第一点:您不应该将 sizeof
(感谢@Remy LEABEAU 的审查)与 TCHAR*
一起使用,而应将 _tcslen()
或 lstrlen
-
在第一行中,您要求显示路径的大小,它是一个指针(一个 TCHAR*)。规模 指针的长度可以是 4 字节或 8 字节,具体取决于您的系统(ref)。所以 8 是正确的。
-
在一个数组中,它的名字也是其中第一个元素的地址。因此,如果您尝试 printf
sizeof(*Path)
,您要求打印指针指向的第一个字符的大小,因此为 1。 -
前两行也解释了第三行的含义:1*8 = 8。
如果 pathLen
是路径的字节大小,您可以使用 _tcslen()
或 lstrlen()
来计算路径的长度,然后使用 sizeof(TCHAR)
as found { {3}}
获得你需要的输出的提议:
printf("pathLen : %lu\n",_tcslen(Path));
printf("TCHAR size : %lu\n",sizeof(TCHAR));
printf("pathLenInBytes : %lu\n",_tcslen(Path)* sizeof(*Path));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。