2012-06-25 18 views
8

So che scrivere qualcosa di simileDa dove vengono i punti di sequenza?

++a = a++; 

è non solo illeggibile, ma viola anche i punti di C/C++ di sequenza.

Da dove vengono queste limitazioni? Come si possono vedere questi "problemi" prima di trovarli come bug?

+0

Bene, tuttavia, è una limitazione del linguaggio design o piuttosto una limitazione della macchina (cpu), comune a qualsiasi lingua? –

+5

'errore: l'operazione su 'a' potrebbe non essere definita [-Werror = sequence-point]' - Ah, grazie, compilatore a portata di mano. – chris

+1

Attiva tutti gli avvisi e compila e tratta gli avvisi come errori logici e non dovrai preoccuparti di questo: '-Werror -Wall -Wextra -ansi -pedantic' –

risposta

8

Fondamentalmente c'è un punto di sequenza C++ 03 tra ogni istruzione. Per ulteriori informazioni vedere lo SO C++ FAQ. Per ulteriori informazioni consultare lo standard C++ e tenere presente che nel C++ 11 i punti di sequenza standard sono stati sostituiti con sequenziati prima dello e in sequenza dopo le relazioni.

Per evitare problemi, non cercare di essere troppo intelligente per fare molto in ogni espressione.

Non provare a eseguire il lavoro del compilatore: lasciatelo al compilatore. Il tuo compito è quello di scrivere codice che altri umani possano facilmente comprendere, ad esempio codice chiaro. Aggiornamenti multipli e l'uso inutile di operatori con effetti collaterali non è compatibile con quello.

Suggerimento: cospargere const quasi ovunque possibile.

Ciò limita le possibili modifiche di stato che un lettore deve prendere in considerazione.

+0

Grazie per la risposta. Vorrei poter 'accettare' molte risposte qui;) –

4

How can one see those 'problems' before finding them as bugs?

Compilare il programma con il livello più rigido e attivare le impostazioni per tutti gli avvisi da segnalare come errori. La maggior parte dei compilatori tradizionali sottolinea gli errori di comportamento non definito a causa dei punti di sequenza.

con GCC è possibile utilizzare:

-Wsequence-point 

che devono segnalare problemi punto sequenza. Notare che è abilitato di default se si utilizza -Wall.

Naturalmente, il modo migliore è provare e scrivere codice più leggibile che eviti il ​​punto di sequenza mis-adventures.

+2

@chris: '-Wall' lo abilita di default, come ho già detto. –

+0

In effetti, l'ho letto male. – chris

+0

+1 per l'opzione '-Wrdence-point'. Non lo sapevo – Nawaz

7

Vengono dallo standard C o C++, che elenca efficacemente sequence points. In alcuni casi semplici, il compilatore potrebbe essere in grado di avvertirti che stai invocando un comportamento non definito, ma non nel caso generale.

Tuttavia, in genere si viola sempre i requisiti del punto di sequenza solo se si scrive codice "interessante" come il proprio esempio. Lo standard di lingua potrebbe imporre particolari restrizioni al codice come questo (che è ciò che fanno linguaggi come Java), ma non c'è un grande vantaggio e il potenziale svantaggio di impedire determinati tipi di ottimizzazione.


1. La terminologia è leggermente cambiata in C++ 11, ma il principio è ancora in gran parte lo stesso, penso.

+0

Grazie per la risposta. Vorrei poter 'accettare' molte risposte qui;) –

+0

Ho risposto a qualche domanda fa circa le differenze tra C++ 98 e C++ 11 su questo: http://stackoverflow.com/a/10655884/365496 – bames53

Problemi correlati