Как раскрутить Си-макросы

Опубликовано в рубрике "Статьи", 28.11.2010.
Тэги: , , автор:

Да, знаю, сложные Си-макросы – это очень плохо. Но, иногда, без них приходится писать такую кучу кода, что неизвестно, что лучше. Вот и мне понадобилось наваять макро-кодогенератор, вот такой (только не спрашивайте, зачем 🙂 ) —

1#define EXPORT_CLASS_FUNC_0(class_name, func_name) \
2 DevResult class_name ##_ ##func_name() { \
3 DevResult result; \
4 try { result = GetMyInstance()-›##func_name(); } \
5 catch(…) { return DEVRESULT_ERR; } \
6 return result; }

Но как увидеть, что он нагенерил? Оказывается, все просто. Для этого, запускаем cpp компилятор от Visual Studio со следующими ключами:

1cl.exe /P /C имя_файла.cpp

Он создаст файл имя_файла.i, куда положит исходный код с развернутыми макросами.

offsetof(s, m)

Опубликовано в рубрике "Статьи", 01.09.2010.
Тэги: , , , автор:

Если порыться по стандартным заголовочным фалам ANSI-C компилятора, то в файле stddef.h можно найти макрос offsetof()

Макрос offsetof() имеет тру-эмбеддерское объявление

1// у кейла
2#define offsetof(s, m) (size_t)&(((s *)0)-›m)
3
4// у IAR’а
5#define offsetof(T, m) (__INTADDR__((&((T *)0)-›m)))

Самое интересное, что несмотря на полезность этого макроса, он очень редко используется. Я и сам не знал о его существовании до сегодняшнего дня.