问题标签 [variadic-macros]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
650 浏览

c - 忽略空的可变参数

当所有参数都传递给 HTML_A 时,此代码按预期工作:

但是,如果我想以格式调用不带参数的 HTML_A:

我在 gcc 下收到此编译错误:

demo.c:17:1:警告:ISO C99 需要使用其他参数
demo.c:在函数“main”中:
demo.c:17:错误:“,”标记之前的预期表达式

cpp 返回:

,,在最后。

0 投票
1 回答
411 浏览

c - 宏计数参数

为了让编译器满意,我必须计算传递给的参数,否则当 pedantic 标志打开并且只传递一个参数时A()gcc 会引发“ ”warning: ISO C99 requires rest arguments to be used

通过这种实现,N_ARGS我只能使用 10 个参数,是否有另一种方法来检查宏中是否有多个无限制的参数?

我知道, ## __VA_ARGS__gcc 扩展,但我想避免警告

0 投票
2 回答
1390 浏览

c - 将参数反转为可变参数宏

如何将参数反转为可变参数宏?例如,我想

我的目标是将前后参数分开:

0 投票
2 回答
2719 浏览

c++ - 与 MSVC++10 兼容的预处理器变量 FOR_EACH 宏

我已经看到一些要求对可变参数FOR_EACH宏进行变体的问题。然而不幸的是,提供的答案与 VC++10 不兼容,因为它在传递给另一个宏时将 __VA_ARGS __ 作为一个参数扩展。请有人提供仍然适用于 VC++10 的 C++11 兼容(因此向前兼容)版本。也许使用经常提到的“解决方法” #define EXPAND(x) x,但是我不知道将其放在哪里以便获得例如该答案的后者在 VC++10 中工作的概括部分。

澄清一下,预期的行为是用于FOR_EACH(x, a, b, ...)产生x(a) x(b), ...,其中 x 是另一个宏。

0 投票
1 回答
281 浏览

c++ - 根据参数数量生成多个宏调用

我试图以重复的方式多次调用这个函数。

我写了以下宏:

等等 ...

我需要调用METADATA_METHODS_IMPL_N其中N的多个参数__VA_ARGS__

上面的代码(带BOOST_PP_OVERLOAD)给了我不合适的结果:

这导致

我想要这样的东西:

  • 有谁知道如何达到预期的结果?
  • 我可以使用库为某些使用Boost.preprocessor自动生成吗METADATA_METHODS_IMPL_KK in [1 .. 10]METADATA_METHODS_IMPL_1
0 投票
3 回答
1564 浏览

c++ - Variadac 宏将宏应用于所有参数

我正在试验 C++11 variadac 宏。

我试图将另一个宏应用于列表中的每个参数。
这是我的第一次尝试:

不幸的是,这不起作用。

我最终让它工作了。但这有点令人费解,并且有一个“n”的限制(其中“n”是我愿意为其键入宏的最大大小)。

所以我的问题是:我是否遗漏了一些简单的东西,可以让我iterate沿着论证链前进?

0 投票
2 回答
314 浏览

c++ - 如何将这个变量转储调试宏增强为可变参数?

第一个工作代码:

这给出了标准错误输出(gcc):


现在我想要一个带有任意数量参数的可变参数宏,例如

DUMP(argc, argc+1);可以工作,输出如下:

int main(int):8:argc='1',argc+1='2'


但我还没有想出一个好的解决方案。这甚至可以用宏来实现吗?如果不是,那么模板或宏和模板的组合如何?如果需要,C++11 和 Boost 都可以,如果没有标准方法,解决方案可以是gcc特定的。寻找实际代码,使可变参数 DUMP 像上面描述的那样工作,或者至少显示等效信息。

0 投票
5 回答
14470 浏览

c++ - 可以通过参数数量重载宏吗?

是如何工作的?如何实现 C99/C++11 可变参数宏以仅根据为其提供多少参数来扩展为不同的事物?

0 投票
1 回答
6800 浏览

c++ - 可变参数宏,其可变参数没有参数

调用M不带可变参数的可变参数宏是否合法?

相关的标准报价是[cpp.replace]/4

如果宏定义中的标识符列表不以省略号结尾,则调用类函数宏时的参数数量(包括那些不包含预处理标记的参数)应等于宏定义中的参数数量。否则,调用中的参数应多于宏定义中的参数(不包括...)。应该存在)终止调用的预处理令牌。

对于没有非可变参数的情况,表单中的调用M()应该是合法的,因为调用有一个参数(不包含预处理标记)。所以比非可变参数多了一个参数。

对于具有一个非可变参数的情况,是否应该有一个尾随,M(1,)引入一个不包含可变参数的预处理标记的参数?否则,参数的数量将等于非可变参数的数量。IE,

但是, ClangGCC都接受以下测试用例:

并产生输出:

这是非标准行为吗?

0 投票
2 回答
321 浏览

c++ - C++ 可变参数宏和模板

我正在玩可变参数宏和模板。有没有什么简单的方法可以实现以下目标?

这就像 std::make_tuple。如何实现 make_my_class?我看到我可能需要“std::decay”,但我不太明白。提前非常感谢。