Passing an initialization list to a macro

我的梦境 提交于 2019-12-03 22:55:56

The preprocessor does not know about {} initialisation. It sees the comma and thinks that's the start of a new macro argument. And then the next one. Only brackets () are things that it knows about.

[C++11: 16.3/11]: The sequence of preprocessing tokens bounded by the outside-most matching parentheses forms the list of arguments for the function-like macro. The individual arguments within the list are separated by comma preprocessing tokens, but comma preprocessing tokens between matching inner parentheses do not separate arguments. [..]

A macro is not a function. It interprets your input vector<int>{1,2,3} as 3 inputs, which are vector<int>{1,2 and 3}. You can change this by making it an expression (vector<int>{1,2,3}) (as you already did).

Everything in parantheses is an expression and vector<int>(...) is a (*special member-)function so the preprocessor sees it as one expression.

Jarod42

Another workaround is to transform your macro into a variadic macro

#define F1(...) 1

Or, in a more general case:

#define M(a) a

into

#define M(...) __VA_ARGS__
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!