Differenza tra funzioni intrinseche e direttive #pragma?

0

Nella Guida all'implementazione del linguaggio ARM C / C ++ (p 99), NOINIT è elencato come direttiva pragma. Nel codice precedente con cui sto lavorando, __no_init è stato definito come una funzione intrinseca (compilatore IAR per MSP430). Capisco che le funzioni intrinseche sono insiemi di codice assembly che sono convenienti per non dover tentare di tradurre in C, ma quello che non capisco è come una funzione intrinseca sia diversa da una #pragma, e perché #pragma NOINIT potrebbe essere il __no_init intrinseco in un compilatore diverso. Cosa rende le direttive #pragma e le funzioni intrinseche in modo diverso?

    
posta Perplexing Pies 07.09.2016 - 23:36
fonte

1 risposta

0

(Parlo in generale, e siepi un po 'perché le lingue differiscono ...)

Le parole chiave sono generalmente riconosciute dalla grammatica della lingua. Questo è un livello di riconoscimento fondamentale . (Senza parole chiave, l'analisi sarebbe più difficile, i messaggi di errore a fronte di errori di sintassi minori molto più difficili da consegnare, ecc ...)

Le parole chiave sono in genere completamente riservate, il che significa (in generale), ad esempio, che non è possibile dichiarare una variabile dello stesso identificatore di una parola chiave, indipendentemente dall'ambito o dal contesto. Ad esempio, non possiamo (generalmente) denominare le variabili come if o while poiché le parole chiave tendono ad essere riservate per la lingua e non per l'utente.

Al contrario, le funzioni sono solo dichiarazioni che obbediscono alle regole di scoping. Pertanto, gli identificatori consentiti per le variabili definite dall'utente in un ambito possono essere riutilizzati con significati diversi (per variabili diverse) in diversi contesti, ovvero ambiti diversi.

A seconda della lingua, naturalmente, funzioni intrinseche sono solo dichiarazioni di funzioni incorporate inserite nello scope globale e che precedono il tuo codice. Le funzioni intrinseche non alterano la grammatica della lingua. Come dichiarazioni ordinarie (anche se integrate), è possibile (teoricamente) riutilizzare questi identificatori in un altro ambito per uno scopo diverso. Quindi, se si dispone di una funzione intrinseca denominata __atomicIncrement , ad esempio, si dovrebbe essere in grado di ridichiarare lo stesso identificatore con un significato diverso in un ambito interno, proprio come le dichiarazioni delle variabili locali possono in genere riutilizzare gli identificatori utilizzati nelle dichiarazioni globali (modulo linguaggio specifico e / o comportamenti del compilatore).

__no_init nei compilatori IAR viene trattato come una parola chiave, non una funzione (intrinseca o meno). È simile alla parola chiave volatile , che modifica la variabile in quella dichiarazione.

(Si noti che volatile influisce sulla generazione del codice ma in più modi che potrebbero semplicemente invocare funzioni intrinseche, perché i compilatori non usano solo sequenze di codice alternative per leggere e scrivere il volatile s (che potrebbe potenzialmente essere realizzato con intrinseco funziona se li hai usati ad ogni accesso della variabile) ma anche a modificare (cioè limitare) le loro strategie di ottimizzazione per il codice adiacente (cioè il codice più ordinario che precede e riesce a un accesso volatile).)

Quindi, in un compilatore viene usato un pragma e in un'altra una parola chiave, entrambi per eseguire la modifica della dichiarazione (ed entrambi come estensioni, sebbene la versione della parola chiave estenda effettivamente la grammatica linguistica mentre la versione pragma si adatta alla grammatica della lingua esistente ). In questo caso, nessuno dei due coinvolge una funzione intrinseca.

    
risposta data 12.09.2016 - 18:45
fonte

Leggi altre domande sui tag