Как написать определение препроцессора, который пропускает строки кода в C ++? - PullRequest
2 голосов
/ 31 декабря 2011

Допустим, это определение препроцессора перед функцией f():

#define write std::cout << "test";
write
void f()
{
    //...
}

и это результат этого макроса:

std::cout << "test"
void f()
{
    //...
}

Как мне написать этот макрос, чтобы он пропускал функцию, а также вставлял некоторый код позади функции, чтобы результат был примерно таким:

std::cout << "test";
void f()
{
    //...
}
std::cout << "test";

Вы знаете, что я имею в виду: макрос (или что-то еще), который пропускает некоторый код и вставляет несколько строк.

1 Ответ

6 голосов
/ 31 декабря 2011

Вы можете передать саму функцию в качестве аргумента макроса:

#define write(...)       \
    std::cout << "test"; \
    __VA_ARGS__          \
    std::cout << "test";

write(
void f()
{
    //...
})

Этот конкретный пример, конечно, плохо сформирован, потому что есть операторы вне функций.

Если вы действительно заинтересованы в печати текста в начале и конце функции, лучше всего создать класс, который печатает текст в его конструкторе и деструкторе, и объявить экземпляр этого типа в начале функция.

...