你无法实施__COUNTER__
直接地。预处理器纯粹是功能性的——没有状态改变。在这样的系统中,隐藏的计数器本质上是不可能的。 (BOOST_PP_COUNTER
does not证明你想要的事情可以做到——它依赖于#include
因此每行只有一个 - 也可以使用__LINE__
。也就是说,实现非常出色,无论如何你都应该阅读它。)
您可以做的是重构您的元程序,以便可以通过纯函数将计数器应用于输入数据。例如使用好的ol'Order:
#include <order/interpreter.h>
#define ORDER_PP_DEF_8map_count \
ORDER_PP_FN(8fn(8L, 8rec_mc(8L, 8nil, 0)))
#define ORDER_PP_DEF_8rec_mc \
ORDER_PP_FN(8fn(8L, 8R, 8C, \
8if(8is_nil(8L), \
8R, \
8let((8H, 8seq_head(8L)) \
(8T, 8seq_tail(8L)) \
(8D, 8plus(8C, 1)), \
8if(8is_seq(8H), \
8rec_mc(8T, 8seq_append(8R, 8seq_take(1, 8L)), 8C), \
8rec_mc(8T, 8seq_append(8R, 8seq(8C)), 8D) )))))
ORDER_PP (
8map_count(8seq( 8seq(8(A)), 8true, 8seq(8(C)), 8true, 8true )) //((A))(0)((C))(1)(2)
)
(向下递归列表,将子列表元素保留在原处并替换非列表元素 - 由8false
- 使用递增计数器变量)
我想你实际上并不想简单地放弃__COUNTER__
值位于程序顶层,因此如果您可以将需要编织的代码放入其中__COUNTER__
包装宏内的值将其拆分为某种序列或列表,然后您可以将该列表提供给类似于示例的纯函数。
当然,能够表达此类代码的元编程库将是显著地相比之下,便携性和可维护性较差__COUNTER__
反正。__COUNTER__
受 Intel、GCC、Clang 和 MSVC 支持。 (不是每个人,例如pcc
没有它,但是有人使用它吗?)可以说,如果您在实际代码中演示了该功能,那么它向标准化委员会提供了更有力的理由:__COUNTER__
should成为下一个 C 标准的一部分。