2.7 KiB
2.7 KiB
ellipsis operator
Ellipsis оператором в макросах называется: ...
Что он делает (пример в ellipsis.c):
#include <stdio.h>
#define TEST(condition, ...) \
((condition) ? printf("Passed test: %s\n", #condition) : printf(__VA_ARGS__))
int main() {
int voltage = 30;
int max_voltage = 20;
TEST(voltage <= max_voltage, "Voltage %d exceeds %d\n", voltage, max_voltage);
max_voltage = 40;
TEST(voltage <= max_voltage, "Voltage %d exceeds %d\n", voltage, max_voltage);
}
Тут у нас происходит следующее:
...объединяет в себе параметры, которые идут после обязательных. В нашем случае получается что туда попадают аргументы, которые идут плслеcondition.__VA_ARGS__- идентификатор, который может появляеться только в случае использования...и представляет из себя аргументы, которые относятся к...- Дальше внутри программы препроцессор раскроет конструкцию:
TEST(voltage <= max_voltage, "Voltage %d exceeds %d\n", voltage, max_voltage);
в что-то подобное:
((voltage <= max_voltage)?
printf("Passed test: %s\n", "voltage <= max_voltage"):
printf("Voltage %d exceeds %d\n", voltage, max_voltage));
Где последняя строка это как раз то, что представляет из себя printf(__VA_ARGS__)
static
Зачем нужно ключевое слово static. Есть 3 варианта:
- Статичные глобальные переменные file1.c
static int counter = 0;
Данная цель - сделать эту переменнюу приватную для файла file1.c, т.е. в других файлах данная
переменная доступна не будет
2. Статичные локальные переменные
void count_calls()
{
static int count = 0;
count++;
printf("Called %d times\n", count);
}
Тут переменная count будет доступна между вызовами функции, т.е. каждый вызов функции будет происходить
добавление 1 к count
Called 1 times
Called 2 times
Called 3 times
- Статичные функции
static void helper()
{
...
}
Тут делает функцию доступной только в файле, где объявлен