Многострочные макросы препроцессора

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

<code>#define sqr(X) (X*X)
</code>

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

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

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

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

 Forever Learner02 мая 2012 г., 20:32
Вы можете легко получить ответ, выполнив поиск SO. напримерstackoverflow.com/questions/4007865/…
 Ayrat22 июл. 2013 г., 13:32
разные методы здесь:parashift.com/c++-faq/macros-with-multi-stmts.html

Ответы на вопрос(4)

Решение Вопроса

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

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

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

 abelenky02 мая 2012 г., 20:34
Слово предостережения: убедитесь, что \ являетсяпрошло символ в строке. В Си пробелы обычно не имеют значения, но в этом случае невидимые пробелы в конце строки могут вас убить.
 Ed S.02 мая 2012 г., 20:36
@ abelenky: Хорошо, спасибо.
 Peter A. Schneider17 апр. 2015 г., 11:17
Один из них должен добавить, что полученный текст находится в одной строке. Поскольку C обрабатывает все пробелы между токенами одинаково, обычно это не имеет большого значения, но все же.
 supercat15 авг. 2015 г., 19:50
Еще одна вещь, которую я бы предложил сделать, это разместить` after all useful lines of the macro, and add a comment afterward saying something like // Пустая строка требуется после макроса. It's sometimes easier to ensure that all lines of a macro end with `чем все, кроме последней строки.

экранируя ее с помощью\:

#define sqr(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 ... красиво.

Эд С. будет иметь ту же проблему с «своп»

 moooeeeep16 апр. 2015 г., 10:11
@ GézaTörök Расширениеsqr(++i) в((++i)*(++i)) будет вызывать неопределенное поведение, потому что значениеi изменяется в этом выражении более одного раза (между операциями нет точки последовательности).
 jiveturkey10 апр. 2015 г., 19:20
Я сделал это как упражнение и, видимо,iначение @ увеличивается, поскольку оно подставляется в макрос (в этом случае оно подставляется дважды), а затем умножается. Такsqr(++5) == ((7) * (7))
 Géza Török09 апр. 2015 г., 13:54
как насчетsqr(++i)? (предположим, у нас естьint i):)
 Géza Török16 апр. 2015 г., 15:38
@ moooeeeep конечно, это то, на что я пытался указать

поставив обратную косую черту \) в конце каждой строки:

#define F(x) (x)   \
              *    \
             (x)
 alk02 мая 2012 г., 20:43
+ 1: за то, что не пропустили скобки вокругx -!)

Ваш ответ на вопрос