скрытое меню

шпаргалка по языку С

Взаимодействие отдельных модулей (допустим в Keil).

Вот откуда инфа http://digitalchip.ru/osobennosti-ispolzovaniya-extern-i-static-v-c-c - очень полезная информация оказалась.

extern

    общая переменная int i для двух модулей aaa.c и bbb.c:
  • аaa.с : int i;
  • bbb.c : extern int i;
  • bbb.c : только так не надо extern int i = 1;
    общая функция void fff(void) для двух модулей aaa.c и bbb.c:
  • аaa.с : void fff(void){...};
  • bbb.c : void fff(void); тут только объявляем ее использование
  • bbb.c : extern void fff(void); тоже самое

static

    static как-бы врубает защиту для переменной от доступности из других модулей :
  • аaa.с : int i;
  • bbb.c : extern int i;
  • ccc.c : static int i; // эта i - не та , что в aaa.c (это отличная самостоятельная переменная только для ссс.с)
    пример неправильной логики :
  • аaa.с : static int i;
  • bbb.c : extern int i;
  • если int i не объявлена ни в каком другом модуле - то это глупость.
    static для функции:
  • aaa.c : static void fff(void){...};
  • bbb.c : void fff(void); ошибки еще не будет (просто объявление функции)
  • bbb.c : fff(); ошибка - нет такой функции
  • bbb.c : void fff(void){}; объявление с функции с телом {} - это уже другая функция fff
  • bbb.c : fff(); тогда ошибки нет

const

    const защищает значение от изменения :
  • aaa.c : (extern) const int i=0; объявляем, устанавливаем значение и запрещаем изменение (const)
  • (aaa.c : int i=2; ошибка - понятно , что на то она и константа, второй раз значение нельзя присваивать)
  • bbb.c : const int i; ошибка ( i уже объявлена) константы (по-умолчанию) похоже имеют глобальную видимость
  • bbb.c : extern const int i; а так нормально
  • bbb.c : extern const int i=5; ну конечно же нельзя (на то она и константа, значение уже установлено в aaa.c)
  • bbb.c : static const int i=9; а так можно! так как это другая i (принадлежит только bbb.c)

const static или static const - неважно

#pragma once

для защиты от «двойного подключения» заголовочных файлов (это по-видимому у MS так) у QT через IFDEF сделано по-другому.

шаблоны templates

далее по мере необходимости
Яндекс.Метрика