В Q1:
Не объявляйте переменные в заголовочном файле. Если вы включите этот заголовочный файл в два исходных файла и скомпилируете исходные файлы вместе, у вас возникнут проблемы. Может быть, ваш компоновщик вытащит вас из них, а может и нет.
Если вам действительно нужны глобальные переменные, а это происходит гораздо реже, чем думают обычные новички, поместите что-то вроде extern int ref_buf;
в заголовочный файл и int ref_buf;
в исходный файл. Это означает, что есть один ref_buf
, и все остальные исходные файлы смогут его найти.
Параметр функции - это, по сути, новая переменная с тем же именем, и все ссылки в функции будут на нее. Вы не сможете получить доступ к глобальной переменной из этой функции. Функция создает внутреннюю область видимости, а переменные, объявленные во внутренней области видимости, отличаются от переменных во внешней области видимости. Это может сбивать с толку и создавать ошибки, поэтому не рекомендуется использовать переменные с одинаковыми именами и разными областями действия. (Переменные с одним и тем же именем в разных определениях структуры обычно не сбивают с толку, так как вы должны указать, какая структура содержит переменную.)
Компилятор скомпилирует функцию, но хороший компилятор выдаст предупреждающее сообщение. Если он отказывается от компиляции из-за того, что одна переменная скрывает другую с тем же именем, это не настоящий компилятор Си.