Что означает `(...)` при определении макроса?

Я обнаружил это в исходном коде Unreal Engine 4 и не узнал его. Конкретный пример этого:

#undef UCLASS

#define UCLASS(...) \
ARadialForceActor_EVENTPARM

Я довольно новый программист, и этот вид макросов мне незнаком. Я предположил, что он определяет макрос, который будет принимать каждую перегруженную версию функции UCLASS (другими словами, каждый экземпляр функции с именем UCLASSнезависимо от типа и количества параметров) и замените его переменной ARadialForceActor_EVENTPARM, Это верно? Если нет, кто-нибудь знает, что это значит? Я попытался написать фрагмент кода, чтобы проверить это, но он вернулся error: "." may not appear in macro parameter list, Я включу его ниже, на случай, если я был прав насчет макроса, и в этом случае я был бы признателен, если бы кто-то мог указать, где я ошибся в своем коде:

#include <iostream>

#define foo( . . . ) bar

using namespace std;

int foo() {cout <<54321<<endl;}

int main()
{  bar=12345;
   cout<<bar<<endl;

   return 0;
}

2 ответа

Решение

Ваше предположение о значении #define foo(...) bar верно. Ваша ошибка в том, что . . . а также ... подобные; они не. ... должен быть написан без пробелов между точками. Если я изменю вашу программу, чтобы прочитать

#include <iostream>

#define foo(...) bar

using std::cout;

int foo()
{
   cout << 54321 << '\n';
}

int main()
{
   bar = 12345;
   cout << bar << '\n';
   return 0;
}

(обратите внимание на другие стилистические исправления; будущие читатели вашего кода будут вам благодарны)

тогда я получаю сообщения об ошибках в соответствии с foo() будучи замененным bar в определении функции, как если бы вы написали

int bar
{
    cout << 54321 << '\n';
}

что, собственно, и говорит препроцессору. (Препроцессор, как всегда, не понимает синтаксис самого языка.)

#define FOO(...)

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

Другие вопросы по тегам