Secondo questo this article, la sintassi corrisponde con quello che @hvd dice:
int square (int) __attribute__ ((pure));
Tuttavia, sembra che gcc
non impone la proprietà di non esaminare lo stato globale quando compilo il seguente esempio.
#include <stdio.h>
int square (int) __attribute__ ((pure));
int outerX = 7;
int square(int x) {
return outerX * x;
}
int main(){
printf("%d\n", square(5));
return 0;
}
le seguenti stampe senza errori, e le piste di codice e produce 35
.
gcc -Wall -Werror -pedantic -O3 Pure.c
gcc --version
gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
Ancora più stranamente, gcc
anche non importa se mutare lo stato globale all'interno della funzione e restituiscono un valore diverso per ogni chiamata causa di una modifica ha causato nello stato globale.
#include <stdio.h>
int square (int) __attribute__ ((pure));
int outerX = 7;
int square(int x) {
outerX++;
return outerX * x;
}
int main(){
printf("%d\n", square(5));
printf("%d\n", square(5));
printf("%d\n", square(5));
return 0;
}
uscita:
40
45
50
Sì, la documentazione è un po 'fuorviante, penso: se una funzione è pura dipende da cosa fa, non da come lo fa. Se una funzione è pura anche se legge variabili globali (ad esempio, poiché tali variabili non cambiano mai), allora può essere dichiarata pura. Per questo motivo, il compilatore non può applicare l'attributo. – hvd
Ha ancora senso con la tua modifica: 'int pure (void) __attribute __ ((pure)); int pure (void) {statico bool pureInited = false; static int pureValue; if (! pureInited) {pureValue = ...; pureInited = true; } return pureValue; } 'Penso che l'attributo' pure' possa essere applicato lì, anche se la funzione modifica le variabili con una durata di memorizzazione statica: l'effetto è comunque che la funzione restituisce sempre lo stesso valore. ('const' potrebbe avere senso anche qui, piuttosto che' pure'.) – hvd
@hvd, pensi che il compilatore urlerà se la funzione restituisce valori diversi su ogni chiamata con gli stessi argomenti? – merlin2011