я сделал следующий C эксперимент: У меня есть три файла (переменного тока, ах, Ьс):Синтаксис C: Является ли следующее «extern volatile const» поведение последовательным среди компиляторов C?
переменного тока:
#define _A_C_ #include "a.h" #undef _A_C_ #include <stdio.h> int v = 19; // some value void fa() { printf("a.c: v = %d\n", v); }
ах:
#ifndef _A_H_ #define _A_H_ #ifndef _A_C_ // before edit the following line was 'extern const int v;' extern volatile const int v; #endif void fa(); #endif
b.c:
#include "a.h" #include <stdio.h> void fb() { printf("b.c: v = %d\n", v); //v = 5; // -> uncomment this and you will get a compile error } int main() { fa(); fb(); getch(); return 0; }
То, что я хочу получить с этим, чтобы иметь возможность изменять переменную выборочно.
Так в основном, v будет рассматриваться как int
для a.c и, как const int
для остальной части кода (например b.c).
С GCC 4.8.1 это ссылки и ведет себя, как и ожидалось.
Я хочу знать, могу ли я полагаться на это поведение в компиляторах C.
Спасибо
EDIT
Благодаря Pascal Cuoq, я понял, что extern const int v;
в ах должен быть изменен, чтобы extern volatile const int v;
избежать оптимизации компилятора выдает
Другие факты
- где
extern const x
синтаксический действует,const x
ВЫЗОВЕТ й экспортироваться как символ в результирующем объектном файле - , таким образом, еще один эквивалент вопроса на самом деле: есть ли случай, когда экспортированный символ
const int x
будет отличаться в итоговый файл объекта, чемint x
? (Например, это COFF разрешает это?)
@hivert внимательно прочитайте, это не тот же вопрос; в основном в сообщении, отмеченном как ответ на этот вопрос, ответчик говорит: «И да, он должен точно соответствовать объявлению в блоке перевода, на котором он фактически объявлен. Если, конечно, вы не участвуете в конкурсе Underhanded C Programming :-)». Я только что продемонстрировал, что нашел способ избежать этого наложения и спросил, могу ли я положиться на него. –
plus, связанный пост относится к C++, а не C –
вопрос кажется мне законным – Bruce