2015-04-28 2 views
7

Google non utilizza l'eccezione nel proprio codice C++. Per gli errori, usano una classe chiamata status che il programmatore deve controllare quando viene restituita da una funzione. Altrimenti il ​​programma non si compila (link https://www.youtube.com/watch?v=NOCElcMcFik alle 41:34). Ho alcune domande:In che modo Google gestisce gli errori in C++

1) C'è qualche esempio di quella classe sul web liberamente disponibile?

2) Va bene per "void f()" che il lavoro con gli effetti collaterali che si trasformano in un "Stato f()". Ma cosa succede se la tua funzione restituisce già un valore? Google non consente il passaggio di riferimenti che non sono const, pertanto non è possibile modificare un oggetto Status a te assegnato. Quindi come fanno?

Grazie per il vostro aiuto.

+0

questo suona un po 'come la classe di Rust [ 'std :: option'] (https://doc.rust-lang.org/std/option/). Il compilatore di Rust si spegnerà e si fermerà se non testerai i risultati di una funzione che restituisce quei tipi di oggetti. – tadman

+0

@tadman: La mia ipotesi è che abbiano hackerato CLang per un simile comportamento. – InsideLoop

+9

Se hai intenzione di lavorare per Google, sono sicuro che ti diranno come funziona la loro pazzia. Se no, perché ti importa? Basta scrivere C++ idiomatico e lasciarli occuparsi della propria sofferenza autoinflitta. –

risposta

4

Da Google style guide:

parametri di ingresso sono di solito i valori o riferimenti const, mentre i parametri di uscita e di ingresso/uscita saranno puntatori non-const.

Come ha detto il docente, Google utilizza un compilatore interno proprietario che è stato truccato per generare errori quando Status non è selezionato.

+0

Bene che risponde a una delle sue due domande –

+0

Seconda risposta aggiunta. –

0

1) Come quello che è stato menzionato in precedenza, è necessario disporre di strumenti personalizzati per applicare tali regole. Queste potrebbero essere regole di analisi del codice che possono essere impostate per generare errori in caso di errori.

2) Esistono modi per restituire più valori in C++. Puoi restituire una coppia in cui un elemento è il valore che ti interessa e l'altro è un oggetto di stato. C++ 11 ha anche introdotto tuple per ulteriori valori di ritorno. Potresti anche scrivere il tuo oggetto contenente tutte le informazioni restituite di cui potresti aver bisogno, ma questo potrebbe finire per essere eccessivo in molti scenari.

Molto probabilmente, Google vorrebbe passare un puntatore invece di un riferimento non const. Credo che preferiscano questo stile perché costringe il chiamante a passare l'indirizzo di un oggetto, quindi è più esplicito che viene utilizzato un "riferimento" all'oggetto e che l'oggetto potrebbe essere modificato.

// let's a code reviewer know 
// that a's address is used and might be modified 
f(&a) 

// requires the code reviewer to know 
// the function signature to determine 
// if the a is passed by value, 
// const reference, or non-const reference 
f(a)