Что означает `(...)` при определении макроса?
Я обнаружил это в исходном коде 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(...)
это означает, что ваш макрос может принимать переменное число аргументов. Смотрите здесь для деталей.