我正在使用Visual Studio C++ 2010学习版。我用变量参数列表做了这个函数:
BOOL Send(SOCKADDR_IN toAddr, LPTSTR command, LPTSTR first, ...) {
if (g_udpSocket == INVALID_SOCKET || command == NULL)
return FALSE;
va_list args;
va_start(args, command);
LPTSTR str = va_arg(args, LPTSTR);
TCHAR szData[DEFAULT_STR_LEN] = {0};
_tcscpy(szData, command);
while (str != NULL) {
_tcscat(szData, TEXT(" "));
_tcscat(szData, str);
str = va_arg(args, LPTSTR);
}
va_end(args);
TCHAR szEncrypted[DEFAULT_STR_LEN] = {0};
DWORD bytesEncrypted = EncryptString((LPBYTE)szData, _tcslen(szData) * sizeof(TCHAR), (LPBYTE)szEncrypted, DEFAULT_STR_LEN * sizeof(TCHAR));
return sendto(g_udpSocket, (char*)szEncrypted, bytesEncrypted, 0, (SOCKADDR*) &toAddr, sizeof(toAddr)) > 0;
}示例调用:
Send(g_listener, CMD_APP, currentAppTitle, NULL);我使用NULL来表示参数列表已结束。在调试配置下,一切运行正常,但是当我切换到发布优化时,会弄乱变量参数。任何类型的优化都不起作用(/Od、/O1、/O2等)。
尽管我使用的是TCHAR宏,但该项目并没有使用UNICODE或MBCS。
如何保持优化(最小化大小)并使变量参数列表工作?
谢谢,Arth
发布于 2010-08-02 21:53:01
va_start()宏会初始化ap,以便随后由va_arg()和va_end()使用,并且必须首先调用。
最后一个参数是变量实参列表之前的最后一个参数的名称,也就是调用函数知道其类型的最后一个参数。
您的代码为:
BOOL Send(SOCKADDR_IN toAddr, LPTSTR command, LPTSTR first, ...) {
/* ... */
va_start(args, command);command应为first,或者应删除first参数。
https://stackoverflow.com/questions/3388387
复制相似问题