Подтвердить что ты не робот

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

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

#define sqr(X) (X*X)

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

ПОЖАЛУЙСТА ЗАМЕТЬТЕ, как указано в заявлении Керрека С.Б. и коаддита, о чем следовало бы указать в принятом ответе, ВСЕГДА поместите фигурные скобки вокруг своих аргументов. Пример sqr - это простой пример, преподаваемый на курсах CompSci.

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

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

Ответ 4

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

#define sqr(X) \
        ((X)*(X))