我正在使用Visual Studio C ++ 2010 Express。我用变量参数列表创建了这个函数:
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。
如何保持优化(最小化大小)并使变量参数列表有效?
谢谢, 阿瑟
答案 0 :(得分:1)
va_start()宏初始化ap以供va_arg()和va_end()后续使用,并且必须首先调用。
参数last是变量参数列表之前的最后一个参数的名称,即调用函数知道类型的最后一个参数。
您的代码为:
BOOL Send(SOCKADDR_IN toAddr, LPTSTR command, LPTSTR first, ...) {
/* ... */
va_start(args, command);
command
应该是first
,或者应该移除first
参数。