(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.