无法在 C/C++ 中将 TCHAR 作为参数传递
Posted
技术标签:
【中文标题】无法在 C/C++ 中将 TCHAR 作为参数传递【英文标题】:Unable to pass TCHAR as parameter in C/C++ 【发布时间】:2021-03-31 10:26:36 【问题描述】:我是一个有指针的菜鸟。
在过去的 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, MAX_PATH) == 0) // Getting exe File Location
printf("Error : %lu\n", GetLastError());
printf("Self Path : %s\n", 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
【问题讨论】:
学习编程和编程语言没有捷径可走。你需要努力学习,而不仅仅是被告知“做这个做那个”。请投资some good books,甚至参加一些课程。 另外请注意“C/C++”之类的术语。没有“C/C++”这样的语言,只有两种非常不同的语言C和C++。 显示的代码是非有效的 C。您使用了仅 C++ 的语句。即使您删除它,代码仍然无效,因为您的printf
格式说明符和参数类型不匹配,导致未定义的行为。请决定,您是在编程 C 还是 C++?你不能两者都做。要么全用C++,要么全用C,请不要混用。
请想一想...在main
函数中,您有变量path
,它是TCHAR
值的数组。 myFunc
函数的参数是单个 TCHAR
值,它不是一个数组。您使用的教程或书籍如何告诉您如何将数组作为参数传递给函数?您的教程或书籍对 数组到指针衰减 有什么看法?他们对声明指针变量有什么看法?
你为什么使用 TCHAR?如果您需要与 Windows 98 兼容,那是因为您不需要。请改用 wchar_t。
【参考方案1】:
我试着回答
在您的第一个版本中,您的原型必须是
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)
找到here
获得你需要的输出的建议:
printf("pathLen : %lu\n", _tcslen(Path));
printf("TCHAR size : %lu\n", sizeof(TCHAR));
printf("pathLenInBytes : %lu\n", _tcslen(Path)* sizeof(*Path));
【讨论】:
该尝试失败。它完全歪曲了TCHAR
类型别名。
请注意,当 TCHAR
映射到 wchar_t
(您应该在现代代码中这样做)时,strlen(Path)
将无法编译,因为它需要 char*
而不是 wchar_t*
.在处理TCHAR
字符串时,请改用_tcslen(Path)
或lstrlen(Path)
。此外,为了计算pathLen
,将长度乘以sizeof(char*)
是完全错误的,完全摆脱sizeof()
并仅使用_tcslen()
/lstrlen()
本身。为了计算pathLenInBytes
,你需要乘以sizeof(*Path)
而不是sizeof(char*)
。
感谢@Remy 的评论。我将根据您的评论编辑答案。以上是关于无法在 C/C++ 中将 TCHAR 作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章
如果我尝试在不同的公共类中将数组作为参数传递,为啥我的构造函数无法在 Java 中编译?
如何使用 Springboot 在 REST 请求 URL 中将 json 对象作为参数传递