Макросы препроцессора с несколькими линиями
Как сделать многострочный макрос препроцессора? Я знаю, как сделать одну строку:
#define sqr(X) (X*X)
но мне нужно что-то вроде этого:
#define someMacro(X)
class X : public otherClass
{
int foo;
void doFoo();
};
Как я могу заставить это работать?
Это только пример, реальный макрос может быть очень длинным.
Ответы
Ответ 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))