无法在 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));