带有变量参数列表C ++的代码优化问题

时间:2010-08-02 13:50:43

标签: c++ optimization variadic-functions

我正在使用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。

如何保持优化(最小化大小)并使变量参数列表有效?

谢谢, 阿瑟

1 个答案:

答案 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参数。