Я вижу, что у вас есть очень ужасное неправильное понимание синтаксиса языка Си.Не для того, чтобы ругать вас, но вы пробовали изучать C из какого-то другого источника?K & R - отличная книга, но она, как известно, лаконична и предполагает, что вы уже знаете программирование.Попробуйте просмотреть списки здесь: Руководство и список книг Definitive C
======
NUMBER
, MAXOP
и MAXVAL
являютсяконстанты.Они определяются через директиву препроцессора и являются NOT переменными.И определенно не внешние переменные , что является совершенно другим понятием.
Когда вы пишете #define NUMBER '0'
, он указывает компилятору заменять каждый экземпляр NUMBER
в источнике на '0'
,Это простой поиск и замена вашего исходного кода.Он не создает переменную, и вы не можете присвоить ей значение.Поэтому просить следовать значению #define
'ed не имеет смысла.Это всегда будет то же значение, которое было записано в источнике.
Также, пожалуйста, имейте в виду, что нет прямой связи между переменными, которые вы определяете в вашей программе, и переменными среды в вашей системе.
По поводу следующих двух вопросов краткий ответ: «Потому что GDB не знает, что они существуют».Более длинный ответ: Как упоминалось ранее, ваши директивы препроцессора - это просто инструкции вашему компилятору для поиска и замены.После того, как вы покончили с ними, вам не нужно больше их хранить, и поэтому компилятор их отбросит.GDB знает столько же о вашей программе, сколько доступно в конечном двоичном файле, который генерирует компилятор.Если компилятор не упоминает ничего о NUMBER
в двоичном файле, GDB даже не может знать, что он когда-либо существовал.
Теперь это не означает, что эти данные невозможно увидеть в GDB.При компиляции вы можете передать опцию -ggdb3
в GCC, чтобы позволить GCC генерировать отладочный код, специфичный для GDB.Это включает в себя подробную информацию о программе, включая все макросы и директивы препроцессора.С этим дополнительным флагом вы можете видеть значение ваших #define
'ed констант, однако помните, что они никогда не изменятся.Это обычно полезно только для наблюдения за выполнением макрофункций, что является гораздо более сложной темой.