无法在 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 中编译?

在 C 中将多维数组作为参数传递

如何在数据块中将数据框作为笔记本参数传递?

如何使用 Springboot 在 REST 请求 URL 中将 json 对象作为参数传递

在 Posix 中将 Shell 上下文变量传递给编译语言 (Java/C/C++)

在 Postman 中将类对象作为参数传递