Я следую руководству по C ++ отсюда - http://www.cplusplus.com/doc / tutorial / preprocessor /, чтобы узнать о директивах препроцессора .

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

Моя попытка, как показано ниже:

#include<iostream>
using namespace std;

#define FUNCTION_WRAPPER(function) function(int arg1, int arg2) { cout << arg1 * arg2; }

FUNCTION_WRAPPER(multiply);

int main() {
    multiply(1, 2);
    return 0;
}

< Сильный > Выход

C ++ требует спецификатора типа для всех объявлений.

c++
2
User 16 Сен 2018 в 19:05

2 ответа

Лучший ответ

Макросы - это простые текстовые замены, и вы можете заставить большинство наборов компиляторов обрабатывать их как таковые и предоставлять вам фактическое текстовое расширение.

Стандартизированная POSIX опция -E для компиляторов C эффективно делает это (без нее предварительная обработка обычно происходит на уровне токенов (не текстуально), что в основном представляет собой микрооптимизацию по сравнению с текстовой предварительной обработкой). gcc и clang в режиме C ++ также имеют параметр -E.

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

File.cc :

#define FUNCTION_WRAPPER(function) function(int arg1, int arg2) { cout << arg1 * arg2; }
FUNCTION_WRAPPER(multiply)

Терминал:

 watch -n 0.2 gcc -E file.cc

Вышеупомянутое должно дать вам следующий вывод препроцессора:

multiply(int arg1, int arg2) { cout << arg1 * arg2; }

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

Fix :

#define FUNCTION_WRAPPER(function) void function(int arg1, int arg2) { cout << arg1 * arg2; }
FUNCTION_WRAPPER(multiply)
2
PSkocik 16 Сен 2018 в 16:22

Вам необходимо указать тип функции:

#define FUNCTION_WRAPPER(function) \
    void function(int arg1, int arg2) { cout << arg1 * arg2; }
4
Paul Ogilvie 16 Сен 2018 в 16:24