Examples
1. void foo(void) 2. { 3. int i = 5; /* i is a non-constant int */ 4. int j = 6; /* j is a non-constant int */ 5. const int ci = 10; /* ci is a constant int */ 6. const int cj = 11; /* cj is a constant int */ 7. 8. int *pi; /* pi is a pointer to an int */ 9. const int *pci; /* pci is a pointer to a const int */ 10. int * const cpi = &i; /* cpi is a const pointer to an int */ 11. const int * const cpci = &ci; /* cpci is a const pointer to a const int */ 12. 13. i = 6; /* Ok, i is not const */ 14. j = 7; /* Ok, j is not const */ 15. ci = 8; /* ERROR: ci is const */ 16. cj = 9; /* ERROR: cj is const */ 17. 18. pi = &i; /* Ok, pi is not const */ 19. *pi = 8; /* Ok, *pi is not const */ 20. pi = &j; /* Ok, pi is not const */ 21. *pi = 9; /* Ok, *pi is not const */ 22. 23. pci = &ci; /* Ok, pci is not const */ 24. *pci = 8; /* ERROR: *pci is const */ 25. pci = &cj; /* Ok, pci is not const */ 26. *pci = 9; /* ERROR: *pci is const */ 27. 28. cpi = &j; /* ERROR: cpi is const */ 29. *cpi = 10; /* Ok, *cpi is not const */ 30. *cpi = 11; /* Ok, *cpi is not const */ 31. 32. cpci = &j; /* ERROR: cpci is const */ 33. *cpci = 10; /* ERROR: *cpci is const */ 34. 35. pi = &ci; /* DANGER: constant ci can be changed through pi */ 36. }
This is the output from the gcc compiler (code is in temp.c):
temp.c: In function 'foo': temp.c:15:3: error: assignment of read-only variable 'ci' temp.c:16:3: error: assignment of read-only variable 'cj' temp.c:24:3: error: assignment of read-only location '*pci' temp.c:26:3: error: assignment of read-only location '*pci' temp.c:28:3: error: assignment of read-only variable 'cpi' temp.c:32:3: error: assignment of read-only variable 'cpci' temp.c:33:3: error: assignment of read-only location '*cpci' temp.c:35:6: warning: assignment discards 'const' qualifier from pointer target type [enabled by default]
This is the output from Microsoft's C compiler:
temp.c temp.c(15) : error C2166: l-value specifies const object temp.c(16) : error C2166: l-value specifies const object temp.c(24) : error C2166: l-value specifies const object temp.c(26) : error C2166: l-value specifies const object temp.c(28) : error C2166: l-value specifies const object temp.c(32) : error C2166: l-value specifies const object temp.c(33) : error C2166: l-value specifies const object temp.c(35) : warning C4090: '=' : different 'const' qualifiers
This is from Embarcadero's (formerly Borland) C compiler:
temp.c: Error E2024 temp.c 15: Cannot modify a const object in function foo Error E2024 temp.c 16: Cannot modify a const object in function foo Error E2024 temp.c 24: Cannot modify a const object in function foo Error E2024 temp.c 26: Cannot modify a const object in function foo Error E2024 temp.c 28: Cannot modify a const object in function foo Error E2024 temp.c 32: Cannot modify a const object in function foo Error E2024 temp.c 33: Cannot modify a const object in function foo Warning W8075 temp.c 35: Suspicious pointer conversion in function foo Warning W8004 temp.c 36: 'cpci' is assigned a value that is never used in function foo Warning W8004 temp.c 36: 'pci' is assigned a value that is never used in function foo *** 7 errors in Compile ***
This is from the Clang compiler:
temp.c:15:6: error: read-only variable is not assignable ci = 8; /* ERROR: ci is const */ ~~ ^ temp.c:16:6: error: read-only variable is not assignable cj = 9; /* ERROR: cj is const */ ~~ ^ temp.c:24:8: error: read-only variable is not assignable *pci = 8; /* ERROR: *pci is const */ ~~~~ ^ temp.c:26:8: error: read-only variable is not assignable *pci = 9; /* ERROR: *pci is const */ ~~~~ ^ temp.c:28:7: error: read-only variable is not assignable cpi = &j; /* ERROR: cpi is const */ ~~~ ^ temp.c:32:8: error: read-only variable is not assignable cpci = &j; /* ERROR: cpci is const */ ~~~~ ^ temp.c:33:9: error: read-only variable is not assignable *cpci = 10; /* ERROR: *cpci is const */ ~~~~~ ^ temp.c:35:6: warning: assigning to 'int *' from 'const int *' discards qualifiers [-Wincompatible-pointer-types] pi = &ci; /* DANGER: constant ci can be changed through pi */ ^ ~~~ 1 warning and 7 errors generated.