Разрешен ли стандартом C доступ к объекту, отличному от const
, через объявление const
?
Например. Гарантируется ли следующий код компилировать и выводить 23 и 42 на стандартной платформе?
единица трансляции A:
int a = 23;
void foo(void) { a = 42; }
единица трансляции B:
#include <stdio.h>
extern volatile const int a;
void foo(void);
int main(void) {
printf("%i\n", a);
foo();
printf("%i\n", a);
return 0;
}
В ISO / IEC 9899: 1999 я только что нашел (6.7 .3, абзац 5):
Если предпринята попытка изменить объект, определенный с типом, квалифицированным константой, посредством использования значения lvalue с типом, не квалифицированным константой, поведение будет неопределенным.
Но в приведенном выше случае объект не определен как const
(а просто объявлен).
ОБНОВЛЕНИЕ
Наконец-то я нашел его в ISO / IEC 9899: 1999.
6.2.7, 2
Все объявления, которые относятся к одному и тому же объекту или функции, должны иметь совместимый тип; в противном случае поведение не определено.
6.7.3, 9
Чтобы два квалифицированных типа были совместимыми, оба должны иметь идентично квалифицированную версию совместимого типа; [...]
Итак, это неопределенное поведение.