Определение макроса препроцессора

Я относительно новичок в C ++ и учусь на нем. Нашему классу была назначена лаборатория, и мой учитель сказал, что описание работы в лаборатории немного сложное для понимания; однако он не внес никаких изменений в лабораторную работу. Итак, я наткнулся на эту часть лаборатории:

Определение макроса препроцессора

В давнем соглашении имена макросов пишутся с большой буквы, и это имя макроса должно быть TRACE_FUNC. Макрос имеет единственный параметр, символ, который будет заменен именем функции при применении макроса к коду. Начало макроса выглядит так:

#define TRACE_FUNC( symbol )  replacement-text`

и препроцессор будет заменять замещающий текст везде, где в исходном коде существует строка TRACE_FUNC (sym), И подавать символ в эту замену.

ПРИМЕЧАНИЕ: оператор #define должен быть все в одной логической строке. Чтобы сохранить длину, вы можете экранировать символ новой строки с обратной косой чертой в конце строки; это будет радовать препроцессор, позволяя разбить определение на несколько строк.

Для этого упражнения заменяющий текст должен быть полным оператором, включая завершающую точку с запятой.

Текст замены должен быть выходным оператором, который печатает символ, сопровождаемый вызванным text (). и перевод строки на стандартный вывод. Вы можете скопировать и изменить один из операторов вывода из исходного файла warning.cpp.

warning.cpp это просто файл, который мы используем и TRACE_FUNC помещается в заголовочный файл.

Итак, я прочитал это пару раз, и я не уверен на 100%, что он спрашивает. Глядя на это с одной стороны, кажется, что он просит меня создать макрос с именем TRACE_FUNC. Если вы посмотрите на это по-другому, он попросит меня использовать макрос TRACE_FUNC. Все это хорошо, но я вообще не знаю, как использовать TRACE_FUNC, я нигде не могу найти какую-либо документацию по нему и не знаю, как создать макрос. Когда я попросил помощи, мой учитель только что сказал. слова, а не те, которые были очень полезны, потому что это был очень извилистый, запутанный ответ без объяснения того, что на самом деле представляет собой TRACE_FUNC.

По сути, все, что сказал мой учитель, было то, что символ внутри TRACE_FUNC должно быть именем одной из функций в исходном коде. В качестве примера, скажем, у нас была функция foo() в пределах предупреждения, тогда символ должен быть foo() (или Фу, я не уверен в этом, либо), из его объяснения. Также в тексте замены видимо само название будет заменено если я поставлю # перед символом. Я думал, что предполагается обозначить директивы препроцессора. Почему я должен использовать это здесь?

Во всяком случае, делать то, что говорит мой учитель, почти ничего не делает. Ни эта линия

#define TRACE_FUNC( foo() ) #foo() called. ;

ни эта линия

#define TRACE_FUNC( foo ) #foo () called. ;

замените любой текст, который, я уверен, является операцией директивы #define. Поэтому я, должно быть, применяю то, что мой учитель сказал неправильно, но я не знаю, почему это неправильно или как это исправить.

Итак, мой вопрос. Является TRACE_FUNC на самом деле макрос, и если да, есть ли какая-нибудь документация, которую я могу прочитать? Или я должен создавать TRACE_FUNC и если да, то как именно я должен это сделать?

5

Решение

Вау, что за чушь! Вы должны правильно изучать C ++, а не тонкости препроцессора.

Вот что вы должны делать, хотя почему-то кто-то догадывается.

#define TRACE_FUNC(sym) std::cout << #sym << "() called\n"
void foo()
{
TRACE_FUNC(foo);
...
}

Я предполагаю, что есть примеры из warning.cpp, которые используют std::cout если нет, то вам придется адаптировать вышеупомянутое к тому, что вы найдете в warning.cpp.

Идея состоит в том, что каждая функция начинается с использования макроса TRACE_FUNC, чтобы вы могли отслеживать выполнение вашего кода. Почему профессор считает, что это хорошая идея для новичков, мне не понятно. Даже если бы это была хорошая идея, вы должны выяснить детали для себя, это даже глупее.

Я мог бы улучшить макрос выше, но это, вероятно, запутало бы еще больше, поэтому я не буду. Сейчас я просто делаю то, что говорит профессор, но игнорирую это. Надеюсь, он займется вещами, которые стоит изучить позже.

6

Другие решения

Вот пример: используйте функцию печати ouput в вашем libray, чтобы заменить стандартную функцию printf здесь

 #define TRACE_FUNC(sym) printf("%s() called", #sym);

использовать его как

TRACE_FUNC(printf)

выход должен быть

printf() called

Ваша настоящая задача — распечатать символ в определенном формате. поэтому вам нужна функция printf или аналогичная функция в вашем #define.

-1