Макросы препроцессора с несколькими линиями

Как сделать многострочный макрос препроцессора? Я знаю, как сделать одну строку:

#define sqr(X) (X*X) 

но мне нужно что-то вроде этого:

 #define someMacro(X) class X : public otherClass { int foo; void doFoo(); }; 

Как я могу заставить это работать?

Это всего лишь пример, реальный макрос может быть очень длинным.

Вы используете символ escape-символа продолжения строки.

 #define swap(a, b) { \ (a) ^= (b); \ (b) ^= (a); \ (a) ^= (b); \ } 

EDIT: Как отметил @abelenky в комментариях, символ \ должен быть последним символом на линии . Если это не так (даже если это просто пробел после этого), вы получите путаные сообщения об ошибках в каждой строке после него.

Вы можете сделать несколько строк макроса, поместив обратную косую черту ( \ ) в конце каждой строки:

 #define F(x) (x) \ * \ (x) 

ПОЖАЛУЙСТА, ОБРАТИТЕСЬ, как указано в заявлении Kerrek SB и coaddict, о котором должно было быть указано в принятом ответе, ВСЕГДА размещайте фигурные скобки вокруг ваших аргументов. Пример sqr – это простой пример, преподаваемый на курсах CompSci.

Вот проблема: если вы определяете ее так, как вы делали то, что происходит, когда вы говорите «sqr (1 + 5)»? Вы получаете «1 + 5 * 1 + 5» или 11
Если вы правильно разместите фигурные скобки вокруг него, #define sqr(x) ((x)*(x))
вы получаете ((1 + 5) * (1 + 5)) или то, что нам нужно 36 … красиво.

У Ed S. будет такая же проблема с «swap»,

Вам нужно уйти от новой строки в конце строки, экранируя ее с помощью \ :

 #define sqr(X) \ ((X)*(X)) 
  • Как сделать строку char из значения макроса C?
  • Можно ли использовать препроцессор C, чтобы определить, существует ли файл?
  • Есть ли способ сделать #define внутри другого #define?
  • C ++: Может ли макрос расширять «abc» на «a», «b», «c»?
  • C ++ #include семантика
  • #pragma pack effect
  • Stringification - как это работает?
  • Есть ли способ переносить сообщение из препроцессора C?
  • Макрос для конкатенации двух строк в C
  • Разрешены ли пустые определения макросов в C? Как они себя ведут?
  • Массив размера массива, который отклоняет указатели
  • Interesting Posts

    Для чего нужны файлы desktop.ini?

    Восстановление данных на рабочем жестком диске

    Прокрутка webview горизонтально внутри ViewPager

    ASP.NET FileUpload в UpdatePanel – все еще не работает

    Удалите локальные tags git, которые больше не находятся в удаленном репозитории

    Использование принтера в Dosbox

    HW ускоренная активность – как получить ограничение размера текстуры OpenGL?

    Мобильная сеть: как получить размер физического пикселя?

    Почему подключение моего iPhone к iTunes приводит к сбою моего ноутбука Acer?

    Поле ввода ввода JQuery

    Как показать текущее местоположение на карте Google на Android Marshmallow?

    Замена 32-битного счетчика циклов на 64-битные значения приводит к сумасшедшим отклонениям производительности

    Java – непрозрачный цвет

    PDF Где читатель Acrobat сохраняет информацию о последних настройках просмотра?

    API-ключ для GCM неожиданно недействителен? Несанкционированная ошибка (401)

    Давайте будем гением компьютера.