Errori, bug, domande - pagina 2025

 

Doppio errore nell'esecuzione

#define  XY( X, Y )      X##Y
#define  f( X )  XY( g, X )
#define  MACRO1( X )     #X
#define  MACRO2( X )     MACRO1( X )
#define  SIZE    5
void OnStart()
{
    printf( "%s", MACRO2( f( SIZE )));
}

Risultato: f(SIZE)

Dovrebbe essere: g5

 
leonerd:

Come posso rimuovere le frecce dal grafico di visualizzazione dei test? Inizio i test e ci sono ancora le frecce e le linee degli input dell'ultimo test.

Pulisci il template tester.tpl, gli oggetti sono probabilmente lì.

 
A100:

Doppio errore nell'esecuzione

Risultato: f(SIZE).

Dovrebbe essere: g5


Mi sembra un risultato logico.

 
fxsaber:
Mi sembra un risultato logico.

Atteso: prima sostituzione della macro interna SIZE, poi la macro intermedia f( X ) e infine la macro esterna MACRO2( X )

Ma il risultato è diverso anche se si usa una logica incompleta:

#define  MACRO1( X )     #X
void OnStart()
{
    printf( "%s", MACRO1( f( SIZE )));
}
//Результат  :f(SIZE)
//должен быть:f( SIZE )

Almeno la differenza è negli spazi

 
A100:

Atteso: prima sostituzione della macro interna SIZE, poi la macro intermedia f( X ) e infine la macro esterna MACRO2( X )

Ma il risultato è diverso anche se si usa una logica incompleta:

Almeno la differenza è negli spazi bianchi

La priorità delle funzioni è, ovviamente, dall'interno all'esterno. Con le macro, invece, è il contrario.

#X è una stringa senza spazi. Si può essere in disaccordo con questo, naturalmente.

 
fxsaber:

La priorità per le funzioni è, ovviamente, dall'interno verso l'esterno. Le macro, invece, hanno il contrario.

#X è una stringa senza spazi. Si può essere in disaccordo con questo, naturalmente.

Ma perché dovremmo inventare nuove regole complicate con una vecchia notazione quando ci sono già vecchie regole semplici con tale notazione - conosciute da una vasta cerchia di persone e stabilite da decenni? Se le regole sono nuove, allora anche le denominazioni dovrebbero essere nuove

 
A100:

Doppio errore nell'esecuzione

Risultato: f(SIZE)

Dovrebbe essere: g5

Ho inviato una richiesta simile al service-desk un anno fa (#1600034), ancora non ha risposto. Sembra che non si preoccupino di tutti questi bug "geek". E in generale, la lingua non intende migliorare, a giudicare da tutti. Solo i grandi bug sono stati corretti, e non di più.
 
A100:

Perché inventare nuove e complicate regole con vecchie denominazioni quando ci sono già vecchie e semplici regole con tali denominazioni - conosciute da una vasta gamma di persone e stabilite da decenni? Se le regole sono nuove, anche le denominazioni dovrebbero essere nuove.

Di cosa stiamo parlando esattamente? Come dovrebbe essere?

 
fxsaber:

Di cosa stiamo parlando esattamente? E come dovrebbe essere?

#X è la stringa così com'è - cioè con gli spazi (se ci sono). E vedere l'esempio sopra di f( SIZE ) -> g5. Non ho inventato io queste regole - è così che fanno i compilatori C++

 
Alexey Navoykov:
Ho inviato una richiesta simile al service-desk un anno fa (#1600034), ancora nessuna risposta. Sembra che non si preoccupino di tutti questi bug "geek". E in generale, la lingua non intende migliorare, a giudicare da tutti. Sistemano solo i bug principali, niente di più.

Mi sono imbattuto in questo per caso ieri e sono rimasto sorpreso di come, insieme a

template<typename T, int n>

Diverse decine di linee di codice si sono letteralmente trasformate in una o due (!). Ecco perché l'ho scritto - a prima vista può sembrare un'inezia. Ancora una volta sono convinto che non ci sono sciocchezze in C++

Motivazione: