Проблема оптимизации кода со списком переменных аргументов C ++ - PullRequest
0 голосов
/ 02 августа 2010

Я использую 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.

Есть идеи, как сохранить оптимизацию (минимизировать размер) и заставить работать список переменных-аргументов?

Спасибо, Arth

1 Ответ

1 голос
/ 02 августа 2010

Макрос va_start () инициализирует ap для последующего использования va_arg () и va_end () и должен вызываться первым.

Параметр last - это имя последнего параметра перед списком аргументов переменной , т.е. последний параметр которого вызывающая функция знает тип.

Ваш код читает:

BOOL Send(SOCKADDR_IN toAddr, LPTSTR command, LPTSTR first, ...) {

  /* ... */

  va_start(args, command);

command должно быть first, или параметр first должен быть удален.

...