Я пытаюсь создать несколько макросов трассировки, которые используют переменные аргументы.Макросы работают правильно только тогда, когда именованный аргумент предшествует переменному.
Ниже приведена минимальная версия кода того, что я делаю.Сбой только TraceTest () без аргументовЯ также попытался создать промежуточный макрос, который передает фиктивный первый аргумент в TraceTest1, но это тоже не удается.
template<typename ...Args>
inline void f(const char*, Args&&... args) { }
#define TraceTest1(a, args...) f("Trace Start ", ##args)
#define TraceTest(args...) f("Trace Start", ##args)
TraceTest(); // error: expected primary-expression before ‘)’ token
TraceTest("a"); // works
TraceTest1(); // works
TraceTest1("a"); // works
Я прочитал документы gnu по макросам с переменными значениями, но не смог найти ничего, что могло бы объяснить это.
Я использую gcc 7.4.0 под Ubuntu 18.04 и компилирую с
g++ -Wall -Wextra -std=c++17 src/event.cpp -obin/event