#50. Ключевые слова static и extern | Язык C для начинающих

preview_player
Показать описание


Ключевые слова static и extern с переменными и функциями. Локальные статические переменные. Ограничение области видимости переменных и функций текущим модулем.
Рекомендации по теме
Комментарии
Автор

Отличный урок !!! Спасибо за изложения высшего класса. Отслеживаю весь ваш вклад в сообщество изучающих программирование в Ютубе.

anvarx
Автор

"в прототипе функции имена переменных можно опускать, т.к. для компилятора это не имеет никакого значения"
Да, но как говорится - есть нюанс.
Если в функции в качестве параметров используется двумерный массив переменной длины.
Например:
void funct(int n, int ar[][n])
и если в прототипе такой функции удалить имена параметров
void funct(int, int[][])
то будет ошибка компиляции, т.к. компилятор не сможет определить размерность массива.
Поэтому для этого существует такая форма записи прототипа:
void funct(int, int[][*])

weerbox
Автор

Замечательные лекции по С!
В эту лекцию можно еще добавить о миксе (смешивании) квалификаторов const и extern. Их можно использовать вместе.
Обычный шаблон таков:
file.h:
extern const int a_global_var;
file.c:
#include "file.h"
const int a_global_var = /* константное значение */;

И для полноты картины можно также поговорить о квалификаторах inline и volatile (они тоже миксуются)

electronic
Автор

В Linux int var_main так же как и static var_st обе переменные будут равны нулю. В Windows int var_main выдаст "мусор". Спасибо огромное за урок ! Пояснение на высшем уровне.

vladimirastrelin
Автор

Хотел увидел уроки по котлину в сравнении с пайтоном, чтоб преподавалрсь в сравнении.
И тот и тот язык очень лаконичный.

kobatrader
Автор

Здравствуйте! подскажите пожалуйста как на мак в настройках указывать файл! Очень прошу!

zvunknx
Автор

Сергей, помогите разобраться, почему если до main объявить массив и указатель на него, то в main возможно менять адрес указателя, а если этот указатель на глобальный массив объявить в main, но со словом static, то уже не можем? Почему позволяется менять адрес указателя, объявленного в глобальной области, если по идее, всё что объявлено вне main по умолчанию является статическим?

Вот так работает.
int a[] = {4, 5, 6};
int* p = a;

int main()
{
p +=1;
printf("%d", *p);

return 0;
}

А вот так не позволяет изменить адрес p.
int a[] = {4, 5, 6};

int main()
{
static int* p = a;

p +=1;
printf("%d", *p);

return 0;
}

cmrisnu
Автор

Спасибо за урок.
1. В стандарте языка Си нет определений понятий "глобальная" и "локальная" переменная. Я думаю эти два термина ненаучны. Какое настоящее название?
2. Я правильно понял, что это есть три характеристики переменной: класс хранения (где выделить память), время жизни (когда деаллоцировать), и область видимости (откуда есть доступ)?

citizenfour
Автор

2:48 ругается на неинициализированную локальную переменную int var_main (Ошибка С4700, Visual Studio 2019)
int main(void)
{
int var_main;
static int var_st;

printf("var_main = %d, var_st = %d\n", var_main, var_st);
return 0;
}

zwdtqxi
Автор

здравствуйте, у вас будут курсы по аналитике данных?

GH-xwrd
Автор

Должен ли я изучать язык программирования C перед изучением C++?
C++ мне нужен для изучения Unreal Engine

JohnSmith-yrih
Автор

Подушню. На самом деле ключевое сдово static не влияет на область видимости, т.к. никакой глобальной области видимости в Си нет🤪 (есть область видимости - блока, прототипа функции, функции, файла/единицы трансляции). А влияет на класс хранения, меняя у переменных определенных в блоке продолжительность хранения с автоматической на статическую, оставляя область видимости в пределах блока, и отсутствие связывания, а у переменных определенных вне функций - меняет внешнее связывание на внутренее, оставляя область видимости в пределах файла, и статическую продолжительность хранения.

weerbox