2010-08-02 1 views
0

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

ответ

1

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

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

Ваш код гласит:

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

    /* ... */ 

    va_start(args, command); 

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

+0

Собственно, 'first' просто нужно уйти. –

+0

@Ben Voigt, или что; это зависит от кода вызывающего абонента. (Примерный вызов не слишком ясен.) – strager

+0

На самом деле это была проблема, но все же странно, что она отлично работает в конфигурации отладки и не работает в конфигурации релиза. Спасибо, Бен-Войт – Arth

Смежные вопросы