是否可以强制转换 c++ 运算符新输出? [关闭]

Posted

技术标签:

【中文标题】是否可以强制转换 c++ 运算符新输出? [关闭]【英文标题】:Is that possible to cast c++ operator new output? [closed] 【发布时间】:2019-08-29 08:37:59 【问题描述】:

我编写了以下函数,它将打印出环境变量的值,但是当我编译它时,它显示以下错误:

 error C2760 : syntax error : unexpected token 'new', expected ';'
warning C4244: 'initializing': conversion from 'DWORD' to 'TCHAR', possible loss of data

我写的代码:

template<typename T>
void EnvironmentVariableParser(T arg_variable_name) 

    PTSTR pszTemp, pszValue = NULL;
    auto dwResult = GetEnvironmentVariable(arg_variable_name, pszValue, 0);

    if (dwResult != 0) 
    
        auto size = dwResult * sizeof(TCHAR);
        pszTemp = new PTSTR(size);
        pszValue = reinterpret_cast<PTSTR>(pszTemp);
        GetEnvironmentVariable(arg_variable_name, pszValue, size);
        std::cout << arg_variable_name << "=" << pszValue << std::endl;
        delete pszValue;
     
    else 
    
        std::cout << arg_variable_name << "=<unknown value>" << std::endl;
    


是否可以将新的运算符输出转换为 PTSTR 之类的东西?

【问题讨论】:

正确的语法是pszValue = new TCHAR[size];,同样free(pszValue);也是无效的,因为它不匹配分配。 您不能将malloc(x) 替换为new x。有好书清单here. OT:operator new 可能是指new-expression。只是不要与operator new 混淆。 我个人建议不要使用匈牙利符号。它带来的问题多于解决的问题...... @Adrian 没错。我从未见过他们实际上优于TCHAR* 等等的例子。它们对应的基本类型(TCHAR 本身)是另一个主题。匈牙利符号(前缀如pszi、...),而不是匈牙利名称。不过,关于后者:与任何其他非英文名称相同:您陷入不得不与其他人共享您的代码的情况下,有一天不说该语言(如果只是在 SO ),任何非英语标识符都会使理解这些代码背后的意图变得更加困难...... 【参考方案1】:

给出的 cmets 是一些答案,但并不精确。您需要的代码修复(使用 cmets)是:

auto size = dwResult * sizeof(TCHAR); // Maybe not needed (see notes).
pszValue = new TCHAR[dwResult];       // NOTE: Not 'size'!!!
GetEnvironmentVariable(arg_variable_name, pszValue, size);
std::cout << arg_variable_name << "=" << pszValue << std::endl;
delete[] psvValue;                    // Don't use: free(pszValue);

我不知道GetEnvironmentVariable 函数的第三个参数是什么:它是缓冲区的实际大小(以字节为单位)还是最大值。 TCHARS 的数量?如果是后者,你给它dwResult 并且永远不需要size

希望这会有所帮助!

编辑:刚刚检查:第三个参数 TCHAR 计数,所以你可以完全不用 size !!

【讨论】:

以上是关于是否可以强制转换 c++ 运算符新输出? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C++ --- 强制转换运算符

需要 OOP C++ 帮助[关闭]

C++ 强制转换运算符重载和多态性

重载强制转换运算符时的 C++ 歧义

如何在 Visual C++ 2015 中的 C++ 强制转换运算符的尖括号内保留空格?

C++基础语法梳理:智能指针和强制类型转换运算符