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