Mi sono imbattuto in uno scenario strano. Sono sicuro che devo aver incontrato la stessa situazione in passato e tuttavia in qualche modo non l'ho notato fino ad ora.
Sto scrivendo un programma che richiede almeno due argomenti da riga di comando. Occuparsi di questo è abbastanza semplice, basta controllare che ci siano argomenti sufficienti. Ad esempio:
A: if (argc < 3) PrintHelpAndQuit();
Tuttavia, voglio anche consentire all'utente di richiedere specificamente le schermate di aiuto usando un singolo argomento da riga di comando. Ad esempio:
B: if (args[1] == "/?") PrintHelpAndQuit();
C: if (args[1] == "/?1") PrintHelp1AndQuit();
D: if (args[1] == "/?2") PrintHelp2AndQuit();
Il problema è che se metto per primo la riga A , si assicura che siano stati specificati almeno due argomenti, il che impedisce le righe B , C , e D da chiamata, e quindi l'utente non può accedere a quegli schermi.
Se metto la riga A dopo le altre, il programma si bloccherà se non viene specificato alcun argomento (l'accesso al primo membro dell'array di argomenti non è definito).
Sembra che ci siano (solo?) due modi per avvicinarsi a questo:
-
Metti le linee della schermata di aiuto in un blocco condizionale che verifica che ci sia almeno un argomento (che duplica il lavoro della linea A ):
if (argc > 1) { if (args[1] == "/?... } if (argc < 3) PrintHelpAndQuit();
-
Metti una riga in più in alto che controlla se non ci sono argomenti e stampa aiuto e si chiude in questo caso:
if (argc < 2) PrintHelpAndQuit(); // now almost entirely duplicates line A if (args[1] == "/?... if (argc < 3) PrintHelpAndQuit();
Entrambi questi approcci sono ridondanti a vari livelli.
In che modo gli altri affrontano questa situazione? Esiste un modo più elegante (e meno ridondante) per richiedere un numero minimo di argomenti senza precludere un singolo argomento?