>>> cat weirdConst.c
#include <stdio.h>
static const unsigned a0 = 0;
int main() {
*((int *)&a0) = 102;
printf("%u\n", a0);
return 0;
}
>>> gcc -Wall -Wextra weirdConst.c
>>> gcc --version
gcc (GCC) 6.3.0
0 ошибок 0 ворнингов. Iar тоже пофиг.
При исполнении правда Segmentation fault
Как бы ок. Но меня возмущает что гцц игнорирует подобное.
На мк вообще нету const
секции и там константа действительно изменяется.
Это я сравнивал enum
vs static const
. enum (за исключением того что он всегда int типа) точно такое не позволит. И памяти тоже гарантированно не занимает (важно для маленького размера флеша/озу мк)
#define
можете даже не упоминать. Не знаю почему сишники так любят численные константы делать через #define
. Да еще и без префиксов библиотеки. А потом эти дефайны везде лезут в неожиданных местах. Если портирую библиотеку и вижу кучу #define
то сразу sed ом превращаю в enum. Ибо нафик. Сейчас есть острое желание сделать static const uint8_t UINT8_MAX_imp = UINT8_MAX; #undef UINT8_MAX; static const UINT8_MAX = UINT8_MAX_imp;
и так для всех численных макросов стандартной библиотеки.