是否可以强制转换 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
本身)是另一个主题。匈牙利符号(前缀如psz
、i
、...),而不是匈牙利名称。不过,关于后者:与任何其他非英文名称相同:您将陷入不得不与其他人共享您的代码的情况下,有一天不说该语言(如果只是在 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++ 运算符新输出? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章