Я использую Visual Studio C++ 2010 Express. Я сделал эту функцию с переменным списком аргументов:Проблема оптимизации кода с переменным списком аргументов C++
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
Собственно, 'first' просто нужно уйти. –
@Ben Voigt, или что; это зависит от кода вызывающего абонента. (Примерный вызов не слишком ясен.) – strager
На самом деле это была проблема, но все же странно, что она отлично работает в конфигурации отладки и не работает в конфигурации релиза. Спасибо, Бен-Войт – Arth