无法在 C/C++ 中将 TCHAR 作为参数传递
Unable to pass TCHAR as parameter in C/C++
我是菜鸟
过去 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
我试着回答
在你的第一个版本中,你的原型必须是
myFunc(TCHAR *Path)
或 myFunc(TCHAR Path[])
因为路径是一个 TCHAR 数组,因此 TCHAR*
(可以找到起始文档 here or )
您从编译的第一个代码中获得的只是您所要求的。
让我们看看:
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)
作为找到
建议获得您需要的输出:
printf("pathLen : %lu\n", _tcslen(Path));
printf("TCHAR size : %lu\n", sizeof(TCHAR));
printf("pathLenInBytes : %lu\n", _tcslen(Path)* sizeof(*Path));
我是菜鸟
过去 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
我试着回答
在你的第一个版本中,你的原型必须是
myFunc(TCHAR *Path)
或 myFunc(TCHAR Path[])
因为路径是一个 TCHAR 数组,因此 TCHAR*
(可以找到起始文档 here or
您从编译的第一个代码中获得的只是您所要求的。 让我们看看:
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)
作为找到
建议获得您需要的输出:
printf("pathLen : %lu\n", _tcslen(Path));
printf("TCHAR size : %lu\n", sizeof(TCHAR));
printf("pathLenInBytes : %lu\n", _tcslen(Path)* sizeof(*Path));