C C  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Препроцессор и макросы

Тест разбирает препроцессор как механизм подстановки токенов, а не как набор «особых функций»: области действия `#define`, конфигурационные ветви, операторы `#` и `##`, приоритеты и повторные побочные эффекты.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 4 темам.
Вопрос 1 из 20
Что делает препроцессор с `#define N 10`?
CC17
#define N 10
int a[N];
Вопрос 2 из 20
Почему `static const size_t limit=10;` часто лучше макроса?
Вопрос 3 из 20
Что выведет препроцессор в выражении?
CC17
#define TWICE(x) x * x
int y = TWICE(2 + 3);
Вопрос 4 из 20
Как ограничить область действия макроса?
Вопрос 5 из 20
Почему имя макроса библиотеки стоит снабжать уникальным префиксом?
Вопрос 6 из 20
Что проверяет `#ifdef FEATURE_X`?
CC17
#ifdef FEATURE_X
use_feature();
#endif
Вопрос 7 из 20
Что произойдёт для `#define DEBUG 0` и `#ifdef DEBUG`?
CC17
#define DEBUG 0
#ifdef DEBUG
puts("debug");
#endif
Вопрос 8 из 20
Как обнаружить конфликт двух взаимоисключающих платформенных флагов?
CC17
#if defined(PLATFORM_A) && defined(PLATFORM_B)
#error "choose one platform"
#endif
Вопрос 9 из 20
Как уменьшить количество #ifdef в бизнес-логике?
Вопрос 10 из 20
Что обязательно для поддержки нескольких конфигураций?
Вопрос 11 из 20
Как исправить макрос квадрата?
CC17
#define SQ(x) /* выберите тело макроса */

int y = 3 / SQ(1 + 2);
Вопрос 12 из 20
Что делает оператор # в макросе?
CC17
#define STR(x) #x
printf("%s", STR(answer));
Вопрос 13 из 20
Как действует оператор `##` в макросе `FIELD(n)`?
CC17
#define FIELD(n) field_##n
int FIELD(3);
Вопрос 14 из 20
Почему static inline функция предпочтительнее арифметического макроса?
Вопрос 15 из 20
Какую проблему не решают скобки в `MAX(a,b)`?
CC17
#define MAX(a,b) ((a)>(b)?(a):(b))
Вопрос 16 из 20
Какой дефект появляется после раскрытия макроса `SQ(i++)`?
CC17
#define SQ(x) ((x)*(x))
int y=SQ(i++);
Вопрос 17 из 20
Зачем многооператорный макрос оборачивают в `do { ... } while (0)`?
CC17
#define LOG_AND_SET(p,v) do { log_value(v); *(p)=(v); } while(0)
Вопрос 18 из 20
Какой вызов безопаснее для MAX?
Вопрос 19 из 20
Что может случиться с макросом `#define SET(x) x=1; x+=2` внутри `if (ok) SET(a); else fail();`?
CC17
#define SET(x) x=1; x+=2
if(ok) SET(a); else fail();
Вопрос 20 из 20
Как гарантировать однократное вычисление аргументов универсального MIN для нескольких типов?

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу