gpt4 book ai didi

C 预处理器 : Own implementation for __COUNTER__

转载 作者:太空狗 更新时间:2023-10-29 15:04:05 26 4
gpt4 key购买 nike

我目前在我的 C 库代码中使用 __COUNTER__ 宏来生成唯一的整数标识符。它运行良好,但我看到两个问题:

  • 它不属于任何 C 或 C++ 标准。
  • 也使用 __COUNTER__ 的独立代码可能会混淆。

因此,我希望自己实现一个等同于 __COUNTER__ 的东西。

我知道但不想使用的替代方案:

  • __LINE__(因为每行多个宏不会获得唯一 ID)
  • BOOST_PP_COUNTER(因为我不想要boost 依赖项)

BOOST_PP_COUNTER 证明这是可以做到的,即使 other答案声称这是不可能的。

本质上,我正在寻找一个头文件“mycounter.h”,这样

#include "mycounter.h"

__MYCOUNTER__
__MYCOUNTER__ __MYCOUNTER__
__MYCOUNTER__

会被gcc -E预处理为

(...)

0
1 2
3

不使用内置的 __COUNTER__

注意:早些时候,此问题被标记为与 this 重复的问题,它涉及使用 __COUNTER__ 而不是避免它。

最佳答案

您不能直接实现 __COUNTER__。预处理器是纯功能性的——没有状态变化。在这样的系统中,隐藏的计数器本质上是不可能的。 (BOOST_PP_COUNTER 确实证明您可以完成您想要的 - 它依赖于 #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__ 受英特尔、GCC、Clang 和 MSVC 支持。 (不是每个人,例如 pcc 没有它,但有没有人使用它?)可以说,如果您在实际代码中演示了该功能的使用,它向标准化委员会提供了更有力的理由 __COUNTER__ 应该成为下一个 C 标准的一部分。

关于C 预处理器 : Own implementation for __COUNTER__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22693565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com