在整个make会话中保留并递增__COUNTER__值?

时间:2015-10-20 19:47:49

标签: c++ macros

我有一种嵌入式编程语言,其语法类似于C语言。它还支持宏__COUNTER__。每次调用它时,我都需要一个特定的函数来增加参数。并且可以在项目中的多个文件中调用此函数,并且值需要跨文件递增。我不想手动跟踪文件中的值(或使用公共标题)。我想使用Counter宏来自动更新此参数。我的问题是宏重置在一个新文件中。

有什么办法可以实现这个目标
  1. 在构建会话中保留并递增宏值?

  2. 还是其他一些全新的方法呢?

2 个答案:

答案 0 :(得分:2)

如果它不需要在编译时进行评估,但运行时就足够了,你可以这样做:

// in a .cpp
int global_counter;

在每个相关职能中:

extern int global_counter;
const static int counter=global_counter++;
// now in counter you have your value 

counter被赋予一个唯一的,单调递增的,每个函数的全局id(即使这在运行时发生,并且确切的值取决于函数的调用顺序)。另请注意,如果您的程序是多线程的,那么您将要使用std::atomic_int

答案 1 :(得分:0)

如果你喜欢愚蠢的解决方案 - 我们走了。相当请确认您的来源的确认备份(即在副本上测试此代码)。

要用递增值替换所有出现的.orig,将原始文件保存在perl -i.orig -p -e '$a='\''/*GENERATED*/'\''; s/\b__COUNTER__\b/$c++.$a/eg' 中(感谢@melpomene,我不是perl):

grep -ho '[1234567890]*/\*GENERATED\*/' *.cpp | cut -d/ -f 1 | sort -n | tail -n 1

找出替换中使用的最大值(shell):

# Find out the largest value used
MAXUSED=$(grep -ho '[1234567890]*/\*GENERATED\*/' *.cpp | cut -d/ -f 1 | sort | tail -n 1)
# Substitute, starting from MAXUSED+1
perl -i.orig -p -e '$m='"$MAXUSED"'+1; $a='\''/*GENERATED*/'\''; s/\b__COUNTER__\b/(($c++)+$m).$a/eg' *.cpp

组合解决方案(shell脚本):

{{1}}
祝你好运!