我有一种嵌入式编程语言,其语法类似于C语言。它还支持宏__COUNTER__
。每次调用它时,我都需要一个特定的函数来增加参数。并且可以在项目中的多个文件中调用此函数,并且值需要跨文件递增。我不想手动跟踪文件中的值(或使用公共标题)。我想使用Counter宏来自动更新此参数。我的问题是宏重置在一个新文件中。
在构建会话中保留并递增宏值?
还是其他一些全新的方法呢?
答案 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}}祝你好运!