Raj*_*ava 5 c gnu c-preprocessor
如果我们__COUNTER__在两个不同的源文件中使用,该值将重置为零。是否可以将__COUNTER__范围扩大到全球范围?
文件:file1.c
int x=__COUNTER__;
int y=__COUNTER__;
Run Code Online (Sandbox Code Playgroud)
文件:file2.c
int a=__COUNTER__;
int b=__COUNTER__;
Run Code Online (Sandbox Code Playgroud)
我想让所有 x、y、a 和 b 都具有唯一的初始化值。在这种情况下,x=a,y=b。
我还尝试放入__COUNTER__一个通用头文件。结果是一样的。
文件:common.h
#define VALUE __COUNTER__
将上述文件中的所有内容替换__COUNTER__为 VALUE。
您可以编译项目,以便每个文件都有一个单独的偏移量(足够大,例如 100)__COUNTER__,并使用该偏移量来拥有单独的计数器。
==> file1.c <==
int x = COUNTER;
int y = COUNTER;
==> file2.c <==
int a = COUNTER;
int b = COUNTER;
==> main.c <==
#include <stdio.h>
extern int a, b, x, y;
int main() {
printf("%d %d %d %d\n", a, b, x, y);
}
Run Code Online (Sandbox Code Playgroud)
此类项目使用 CMake 配置:
cmake_minimum_required(VERSION 3.11)
project(test)
file(GLOB srcs *.c)
set(ii 0)
foreach(ff IN LISTS srcs)
set_source_files_properties(${ff} PROPERTIES COMPILE_DEFINITIONS
# add an offset to each file
COUNTER_OFFSET=${ii}
)
# increment is by 100
math(EXPR ii "${ii} + 100")
endforeach()
add_compile_definitions(
# add COUNTER definition with the offset
"COUNTER=(__COUNTER__+COUNTER_OFFSET)"
)
add_executable(test ${srcs})
Run Code Online (Sandbox Code Playgroud)
这样每个文件都有一个单独的唯一偏移量,并且COUNTERepxands 为__COUNTER__ + some offset:
[1/4] /usr/bin/cc -DCOUNTER="(__COUNTER__+COUNTER_OFFSET)" -DCOUNTER_OFFSET=100 ...
[2/4] /usr/bin/cc -DCOUNTER="(__COUNTER__+COUNTER_OFFSET)" -DCOUNTER_OFFSET=200 ...
[3/4] /usr/bin/cc -DCOUNTER="(__COUNTER__+COUNTER_OFFSET)" -DCOUNTER_OFFSET=0 ...
Run Code Online (Sandbox Code Playgroud)
程序输出:
$ bin/test
100 101 0 1
Run Code Online (Sandbox Code Playgroud)
您可以跟踪每个文件使用正则表达式的次数,然后仅按文件中使用的COUNTER次数增加偏移量,希望创建一些有限的连续计数。COUNTER