Articles of c препроцессор

Смущенный квадратом макроса SQR в c

Этот вопрос был задан мне в издевательском интервью … Действительно удивился, найдя неудобные ответы … рассмотрим макрос: #define SQR(x) (x*x) Пример 1: SQR(2) //prints 4 Пример 2: Если SQR (1 + 1) задано, он не суммирует (1+1) до 2 а скорее … SQR(1+1) //prints 3 Неудобно? Какова причина? Как работает этот код? ПРИМЕЧАНИЕ. Я искал […]

C-блок становится выражением: ({int a = 1; int b = 2; a + b;}) равно 3

Во время чтения http://en.wikipedia.org/wiki/C_preprocessor#Multiple_evaluation_of_side_effects я наткнулся на этот пример: \#define max(a,b) \ ({ typeof (a) _a = (a); \ typeof (b) _b = (b); \ _a > _b ? _a : _b; }) // WHY DOES THIS LINE WORK? Который вы можете использовать точно как функция, т. max(1,2) – выражение, оценивающее значение 2. Мой вопрос: […]

#define против перечислений для адресации периферийных устройств

Я должен программировать периферийные регистры в микроcontrollerе на базе ARM9. Например, для USART я сохраняю соответствующие адреса памяти в enum : enum USART { US_BASE = (int) 0xFFFC4000, US_BRGR = US_BASE + 0x16, //… }; Затем я использую указатели в функции для инициализации регистров: void init_usart (void) { vuint* pBRGR = (vuint*) US_BRGR; *pBRGR = […]

#define кортеж в C

Я хочу иметь возможность определять кортеж, который представляет аргументы, необходимые для других макросов. Я думаю, что лучший способ показать, что я хочу, – показать пример: #include #define LED_PORT PORTB #define LED_DDR DDRB #define LED_PIN PB7 #define LED LED_PORT, LED_DDR, LED_PIN #define OUTPUT(port, ddr, pin) ddr |= 1 << pin void main(void) { OUTPUT(LED); } Я […]

Что означают числа в препроцессированных файлах .i при компиляции C с gcc?

Я пытаюсь понять процесс компиляции. Мы можем просмотреть промежуточный файл препроцессора, используя: gcc -E hello.c -o hello.i или же cpp hello.c > hello.i Я грубо знаю, что делает препроцессор, но мне трудно понять числа в некоторых строках. Например: # 1 “/usr/include/stdc-predef.h” 1 3 4 # 1 “” 2 # 1 “hello.c” # 1 “/usr/include/stdio.h” 1 […]

Директива препроцессора #ifndef для кода C / C ++

В eclipse, когда я создаю новый class C ++ или заголовочный файл C , я получаю следующий тип структуры. Скажем, я создаю файл заголовка example.h, я получаю следующее: /*Comments*/ #ifndef EXAMPLE_H_ #define EXAMPLE_H_ /* Place to put all of my definitions etc. */ #endif Я думаю, ifndef говорит, что если EXAMPLE_H_ не определен, определите его, […]

Предпроцессорная кодовая навигация в среде IDE для проекта C

Фон Я трачу много времени на навигацию и редактирование запутанных научных кодов C. Обычно они содержат сотни дополнительных функций, включенных и выключенных с помощью директив препроцессора. Это делает практически невозможным сразу сказать, активирован ли текущий блок кода в моей текущей настройке или нет. Сам код не помогает, так как каждая функция размыта повсюду, и все […]

Подсчет макросов препроцессора

У меня есть этот макрокоманд, который позволяет мне определить как перечисление C, так и список перечисленных имен в виде строк, используя одну конструкцию. Это мешает мне дублировать имена перечислителей (и, возможно, вводить ошибки для больших списков). #define ENUM_DEFINITIONS(F) \ F(0, Item1) \ F(5, Item2) \ F(15, Item3) \ … F(63, ItemN) затем: enum Items { […]

Определить массив в C

У меня есть несколько массивных массивов элементов (хранение данных растровых изображений для отображения на экранах lcd.) Я хотел бы разместить их под заголовком и #define , но я продолжаю получать ошибки компиляции. Как я могу сделать это в C ? #define numbers[450] {0, 1,etc…} #define numbers {0, 1, etc…} #define numbers[450] затем установите числа позже […]

C / C ++ #define Макро внутри макроса?

Мне хотелось бы что-то вроде: #define C_OR_CPP(C__, CPP__) #ifdef __cplusplus\ CPP__\ #else\ C__\ #endif Является ли это возможным? Может быть, какой-то грязный хак с #include? Причина: Я создаю заголовок, где структура использует переменную-член типа vector* , но в C я хочу, чтобы она просто была void* , вы знаете. ТИА