我想为我的标题中的每个类生成唯一的数字,在我的案例中为素数,但是假设这应该只是连续的数字,即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) 我需要一种使用预处理器指令生成唯一值的方法.目的是每次调用宏时,它将具有唯一的整数标识符.但它应该保留它跨文件的价值.有点像预处理器计数器,用于调用函数的次数.
我正在使用的宏是:
#define LOG_MSG(a) log_msg(?)
Run Code Online (Sandbox Code Playgroud)
该宏仅在一个地方定义.在预处理阶段,'?' 将被唯一标识符替换.我们这样做是为了减少字符串带来的开销,因为此代码将在嵌入式设备上运行.在预处理之后,将提取标识符和相关字符串,并且将创建将映射它们的表(这将在应用程序侧).
由于这将用于多个文件,我想要一种方法来为多个文件中的每次使用生成唯一标识符(整数而不是字符串)(每个唯一字符串的标识符将是理想的但不是必需的).
有任何想法吗?
如果有任何遗漏或不完整的信息,请提及
笔记
__COUNTER__
这是我尝试的第一件事,但它并不适用于文件.
__FILE__
会给我一个破坏目的的字符串.
有人提到使用唯一文件标识符.但我不想静态分配这些.我们正在使用CCS(它基于Eclipse Kepler构建)来构建此代码.所以我想我们可以在构建系统中添加一些内容来执行@embedded_guy所提到的内容.谁知道怎么做?
谢谢
参考涉及变量的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)
我知道我可以在这种情况下使用数组,但这只是一个例子来解释我的意思.
我有兴趣能够做这样的事情:
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 工作,至少不能完全工作。