Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » define

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

PDWORD

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как в define в С сделать что-то вроде:
#define lalala(...) lalala2(...)
Т.е. чтобы все что внутри скобок туда предалось?

Всего записей: 31 | Зарегистр. 24-07-2007 | Отправлено: 15:34 25-07-2007
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
есть несколько вариантов
1) если нужен вызов функции, то
#define lala f
lala(1,2,3);
2) если несколько параметров нужно интерпретировать как один, то их нужно оъединить скобками
#define lala(a)  l(a)
lala((1,2,3,4,5))
3) можно использовать трюк с замено запятой на что-то другое
#define lala(a)
#define _ ,
lala(1 _ 2 _ 3 _ 4)

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 15:59 25-07-2007
PDWORD

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Функции с неопределенным числом параметров.
Всегда пользовался первым вариантом, просто интересно есть ли еще способы

Всего записей: 31 | Зарегистр. 24-07-2007 | Отправлено: 17:43 25-07-2007
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
В С99 есть понятие макроса с переменным количеством аргументов. Например:
Код:
#define error(code, msg, ...) fprintf(stderr, "Error %d" msg, code, __VA_ARGS__)
 
/* ... */
 
if (!someCondition) error(getErrorCode(), ". Source file is %s, line number is %d\n", __FILE__, __LINE__);


----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 20:50 25-07-2007 | Исправлено: Qraizer, 20:55 25-07-2007
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer
да только С99 встречается не слишком часто

Цитата:
*Full: Comeau C/C++ (compiler) + Dinkumware (lib)
For: many platforms
* Full: IBM C for AIX version 6
For: AIX
* Intel C (at least compiler)
For: x86
* Full: Compaq/HP/Dec C (this has had various flavors)
For: Unsure
* Full: SGI C
For: SGI platforms (MIPS IRIX I guess)
* Full: Lund Multiprocessor Compiler Company
For: PowerPC LINUX on Apple G4
* Unsure: SAS/C
For: IBM mainframes
* Partial: gcc
For: Many platforms
* Partial: lcc-win32
For: MS-Windows

ни VC, ни компиляторов под встроенные системы.
Поэтому если нужен переносимый код я стараюсь не использовать С99 (часто вообще приходится делать некий минимум языка С )

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 12:07 26-07-2007
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
WiseAlex
Это да. Однако это тоже способ, о котором никто не упомянул, а есть ли его поддержка у средства разработки PDWORD-а - это ему лучше знать.
Что касается переносимости, то C99 спроектирован достаточно разумно, чтобы директивами условной компиляции обойти все тонкие места. Причём соответствующие макросы описаны в самом C99. Так что было бы желание...

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 13:18 26-07-2007
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer

Цитата:
чтобы директивами условной компиляции обойти все тонкие места

буду знать

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 13:41 26-07-2007
PDWORD

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нету, это первое что пришло мне в голову

Всего записей: 31 | Зарегистр. 24-07-2007 | Отправлено: 14:40 26-07-2007
1lex1

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возможно ли при использовании define-макроса в аргументах вставлять несколько строк кода, наподобие следующего примера?
Код:
#define macroIf(trcod,flcod) if(x<100) { trcod } else { flcod }    
int x,y,z;  
int main()
{
    macroIf(
    // 2 строки кода на 1-й аргумент:
    y = x + z;
    y = z * y;
    ,
    y = x * z; // 1-я строка кода на 2-й аргумент
    y = y - z; // 2-я строка кода на 2-й аргумент
    )
}
Обратный слэш не нужен в строках 5...11? Комментарии в строках 5...11 можно обозначать двумя слэшами, а не блоком? Если аргументы или комментарии будут содержать внутри запятые, повлияют ли они на подстановку в макросы? Возможно ли макрос подставлять на место аргумента другого макроса?

Всего записей: 278 | Зарегистр. 22-11-2013 | Отправлено: 19:32 18-12-2021
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » define


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru