【问题标题】:__COUNTER__ with global scope__COUNTER__ 具有全局范围
【发布时间】:2015-08-03 07:22:38
【问题描述】:

如果我们在两个不同的源文件中使用__COUNTER__,该值将重置为零。是否可以将__COUNTER__ 范围设为全局?

文件:file1.c

int x=__COUNTER__;

int y=__COUNTER__;

文件:file2.c

int a=__COUNTER__;

int b=__COUNTER__;

我希望所有 x、y、a 和 b 都具有唯一的初始化值。 在这种情况下,x=a,y=b。


我还尝试将__COUNTER__ 放在一个通用头文件中。结果是一样的。

文件:common.h

#define VALUE __COUNTER__

将上述文件中的所有 __COUNTER__ 替换为 VALUE。

【问题讨论】:

  • 不,这是不可能的,因为__COUNTER__ 在预处理期间工作并且不知道其他源文件。你需要有点聪明才能达到预期的效果。
  • @SedatKapanoglu 不。这个问题是关于具有不同工具链的不同语言。不适用。
  • @FUZxxl 撤回,谢谢!
  • 全球在哪里?在你的电脑?在你的网络上?在整个 C 程序世界中?

标签: c gnu c-preprocessor


【解决方案1】:

您可以编译您的项目,使每个文件都有an individual offset(足够大,比如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);
}

使用 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})

这样每个文件都有一个单独的唯一偏移量,并且COUNTER epxands to __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 ...

程序输出:

$ bin/test 
100 101 0 1

您可以通过正则表达式跟踪每个文件使用COUNTER 的次数,然后仅将偏移量增加文件中使用COUNTER 的次数,希望创建一些有限的连续计数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 2012-07-17
    • 2012-04-29
    • 2011-03-17
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    相关资源
    最近更新 更多