相关疑难解决方法(0)

在编译时生成唯一的数字

我想为我的标题中的每个类生成唯一的数字,在我的案例中为素数,但是假设这应该只是连续的数字,即1,2,3,4等.

当然我可以硬编码:

struct A { enum { ID = 1; }; };
struct B { enum { ID = 2; }; };
struct C { enum { ID = 3; }; };
struct D { enum { ID = 4; }; };
Run Code Online (Sandbox Code Playgroud)

这非常容易出错,因为实际上类不是那么小,如果我在中间添加一个新类,如果我不想完全忽略ID的概述,我必须更改以下所有数字.

我希望我能做到以下几点:

struct A { enum { ID = get_next_int(); }; };
struct B { enum { ID = get_next_int(); }; };
struct C { enum { ID = get_next_int(); }; };
struct D { enum { ID …
Run Code Online (Sandbox Code Playgroud)

c++ metaprogramming side-effects compile-time c++11

8
推荐指数
1
解决办法
6463
查看次数

如何在跨文件预处理时获取唯一值

问题

我需要一种使用预处理器指令生成唯一值的方法.目的是每次调用宏时,它将具有唯一的整数标识符.但它应该保留它跨文件的价值.有点像预处理器计数器,用于调用函数的次数.

进一步的信息

我正在使用的宏是:

#define LOG_MSG(a) log_msg(?)
Run Code Online (Sandbox Code Playgroud)
  1. 'a'是用户想要打印的字符串.
  2. log_msg是一个用于在UART上打印消息的自定义函数
  3. '?' 如果我需要帮助的部分.

该宏仅在一个地方定义.在预处理阶段,'?' 将被唯一标识符替换.我们这样做是为了减少字符串带来的开销,因为此代码将在嵌入式设备上运行.在预处理之后,将提取标识符和相关字符串,并且将创建将映射它们的表(这将在应用程序侧).

由于这将用于多个文件,我想要一种方法来为多个文件中的每次使用生成唯一标识符(整数而不是字符串)(每个唯一字符串的标识符将是理想的但不是必需的).

有任何想法吗?

如果有任何遗漏或不完整的信息,请提及

笔记

__COUNTER__这是我尝试的第一件事,但它并不适用于文件.
__FILE__会给我一个破坏目的的字符串.

有人提到使用唯一文件标识符.但我不想静态分配这些.我们正在使用CCS(它基于Eclipse Kepler构建)来构建此代码.所以我想我们可以在构建系统中添加一些内容来执行@embedded_guy所提到的内容.谁知道怎么做?

谢谢

c embedded macros c-preprocessor

6
推荐指数
2
解决办法
1285
查看次数

有没有办法在C/C++的编译时生成变量名?

参考涉及变量的SO线程C宏令牌连接 - 是否可能?,

是否可以在C和C++的编译时生成变量名?

就像是

int count = 8;
for(i=0; i<count; i++) {
    int var_%i% = i*i;   // <--- magic here
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以在这种情况下使用数组,但这只是一个例子来解释我的意思.

c c++

3
推荐指数
1
解决办法
3505
查看次数

C++ 编译时状态变量

我有兴趣能够做这样的事情:

 void ISR()
 {
    MEASURE_TIME(counters)
    do_something();
    MEASURE_TIME(counters)
    do_something_else();
    MEASURE_TIME(counters)
    do_another_thing();
    MEASURE_TIME(counters)
    do_one_last_thing();
    MEASURE_TIME(counters)
 }
Run Code Online (Sandbox Code Playgroud)

这会在编译时以某种方式转换为:

 void ISR()
 {
    counters[0] = measure_time();
    do_something();
    counters[1] = measure_time();
    do_something_else();
    counters[2] = measure_time();
    do_another_thing();
    counters[3] = measure_time();
    do_one_last_thing();
    counters[4] = measure_time();
 }
Run Code Online (Sandbox Code Playgroud)

有没有办法使用预处理器(似乎不太可能)或模板来维护和增加整数状态?

我知道我可以这样做:

 void ISR()
 {
    int i = 0;
    counters[i++] = measure_time();
    do_something();
    counters[i++] = measure_time();
    do_something_else();
    counters[i++] = measure_time();
    do_another_thing();
    counters[i++] = measure_time();
    do_one_last_thing();
    counters[i++] = measure_time();
 }
Run Code Online (Sandbox Code Playgroud)

但是拥有编译时索引还有一些额外的价值(如果不涉及一些专有细节,这里很难解释)


编辑:这是在嵌入式系统上,并且__COUNTER__不可用(我刚刚尝试过:__COUNTER__不是由我的编译器或预处理器定义的),并且我不确定我是否可以让 Boost 工作,至少不能完全工作。

c++ templates compile-time c-preprocessor

3
推荐指数
1
解决办法
700
查看次数