2010-08-02 13 views
0

J'utilise Visual Studio C++ 2010 Express. J'ai fait cette fonction avec liste d'arguments variable:Problème d'optimisation du code avec la liste d'arguments variables 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; 
} 

Exemple d'appel:

Send(g_listener, CMD_APP, currentAppTitle, NULL); 

J'utilise NULL pour indiquer que la liste des paramètres est terminée. Tout fonctionne bien sur la configuration du débogage, mais lorsque je passe à la version, les optimisations gâchent l'argument variable. Tout type d'optimisation ne fonctionne pas (/ Od,/O1,/O2, ...).

Malgré le fait que j'utilise des macros TCHAR, le projet n'utilise pas UNICODE ni MBCS.

Des idées sur comment conserver les optimisations (minimiser la taille) et faire fonctionner la liste des arguments variables?

Merci, Arth

Répondre

1

La macro va_start() initialise ap pour une utilisation ultérieure par va_arg() et va_end(), et doivent être appelés en premier.

Le dernier paramètre est le nom du dernier paramètre avant la liste d'arguments variables, c'est-à-dire, le dernier paramètre dont la fonction appelante connaît le type.

Votre code lit:

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

    /* ... */ 

    va_start(args, command); 

command devrait être first, ou le paramètre first doit être supprimé.

+0

En fait, 'first' doit juste disparaître. –

+0

@Ben Voigt, Ou que; Cela dépend du code de l'appelant. (L'exemple d'appel n'est pas trop clair.) – strager

+0

En fait, c'était le problème, encore bizarre, il fonctionne très bien sur la configuration de débogage et cela n'a pas fonctionné sur la configuration de la version. Merci Ben Voight – Arth