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
En fait, 'first' doit juste disparaître. –
@Ben Voigt, Ou que; Cela dépend du code de l'appelant. (L'exemple d'appel n'est pas trop clair.) – strager
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