- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在玩预处理器和 c。尝试实现我自己的事件和层次结构系统。但是我遇到了一个问题。我正在尝试静态定义可以初始化的“模块”,以及一些预先静态定义的事件。对于我使用的事件,COUNTER 效果很好。但我不想混淆模块 ID 和事件 ID。
我想要实现的目标的简化版本:
层次结构.h
#define HIERARCHY_DEFINE(NAME) int hierarchyId = __COUNTER__
事件.h
#define EVENT_REGISTER(NAME) int eventId = __COUNTER__
主.c
#include "event.h"
#include "hierarchy.h"
EVENT_REGISTER(EventOne);
HIERARCHY_DEFINE(ModuleOne);
EVENT_REGISTER(EventTwo);
int main(void){
printf("events(%d, %d) modules(%d)\n",EventOne,EventTwo,ModuleOne);
return 1;
}
这将打印出:
events(0, 2) modules(1)
当我试图实现:
events(0, 1) modules(0)
我环顾四周,有人说我不能自己创建一个计数器。看到了升压计数器,但这也没有达到我想要的效果。
有人知道我该如何处理这种情况吗?
谢谢!
编辑:
对我的代码的实际外观略作修改
struct Event{
uint8_t eventId;
uint8_t * data;
const char * description;
};
#define EVENT_REGISTER(eventName, desc)\
static Event eventName = {.eventId = __COUNTER__, .data = 0, .description = desc }
EVENT_REGISTER(Timer_5, "Timer 5 hZ");
最佳答案
除非您对标识符有额外的要求,否则可以执行以下操作:
定义.inc
EVENT_REGISTER(Timer_5, "Timer 5 Hz")
EVENT_REGISTER(Timer_10, "Timer 10 Hz")
MODULE_REGISTER(Module_SSH)
MODULE_REGISTER(Module_NCO)
#undef EVENT_REGISTER
#undef MODULE_REGISTER
应用.c
#define EVENT_REGISTER(a, d) a,
#define MODULE_REGISTER(a)
enum events {
#include "definitions.inc"
};
#define EVENT_REGISTER(a, d)
#define MODULE_REGISTER(a) a,
enum modules {
#include "definitions.inc"
};
struct Event {
uint8_t event_id;
uint8_t *data;
const char *description;
};
#define MODULE_REGISTER(a)
#define EVENT_REGISTER(a, d) static struct Event Event_##a = { .event_id = a, \
.data = NULL, \
.description = d \
};
#include "definitions.inc"
int main (int argc, char **argv)
{
printf("events(%d, %d) modules(%d)\n", Timer_10, Timer_5, Module_SSH);
return EXIT_SUCCESS;
}
关于c - 多个 __COUNTER__ C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40505091/
如果我们使用 __COUNTER__在两个不同的源文件中,该值将重置为零。是否可以制作 __COUNTER__范围全局? 文件:file1.c int x=__COUNTER__; int y=__C
我看到这个问题: How to generate random variable names in C++ using macros? 回答如下:https://stackoverflow.com/a
我的电脑上安装了两个版本的 C++ 编译器。其中一个可以识别 __COUNTER__ 宏,而另一个则不能。在做了一些研究以使程序在两者中编译之后,我还没有遇到 __COUNTER__ 的宏定义。这是编
我正在做一些模板元编程,大部分只是编写我自己的编译时间列表,但我也有一些预处理器魔法,如果可能的话,我想用它来使事情变得更容易。 我想做的是创建仿函数的编译时列表。该部分已完成,但用于简化创建(并添加
我有一段代码使用 __COUNTER__ 宏来为变量生成唯一的名称。 此代码可移植吗?我知道 GCC 和 MSVS 支持它。其他编译器呢?宏是由标准定义的吗(据我所知,在 C++14 之前它不是)。
我正在尝试使用 __COUNTER__ 宏在我的代码中生成唯一的变量名。但是宏似乎不起作用。我可能以错误的方式使用它。请就我做错的地方向我提供指示或建议。 #define DUMB_MACRO() h
我想生成对编写单元测试用例有用的不同命名函数。我想这样做基本上是为了给每个单元测试用例赋予唯一的名称。 我正在使用 google 测试框架 编写单元测试用例。我必须使用 TEST_Macro 来编写单
我在玩预处理器和 c。尝试实现我自己的事件和层次结构系统。但是我遇到了一个问题。我正在尝试静态定义可以初始化的“模块”,以及一些预先静态定义的事件。对于我使用的事件,COUNTER 效果很好。但我不想
我想对 __COUNTER__ 进行字符串化并将其打印为字符串而不是整数,这可能吗? printf("%s\n", #__COUNTER__); 下面的方法我都试过了,还是不行 hello.c:6:1
我有一个执行类似于以下操作的宏: #define MAKE_VALS(...) \ int val1 = 0; \ int val2 = 0; \ : if(val1
我正在尝试编写一个宏,它将每个源文件仅扩展一次 __COUNTER__ 宏。我完全理解宏是如何处理它们的扩展的,但我在这个方面遇到了困难。我想在文件顶部扩展一次 __COUNTER__ 宏,然后对该定
我正在将一个项目从 Linux 迁移到 Xcode,我遇到了“版本”问题。 我在编译时需要一个唯一标识符来处理我的动态内容,在 linux 上我使用的是 __ COUNTER__ 预处理器,但似乎 X
是否可以在头文件的开头重置 __COUNTER__ 宏,使其在头文件中的计算在多个编译单元上保持一致? 最佳答案 枚举怎么样? enum { COUNTER_BASE = __COUNTER__ };
我目前在我的 C 库代码中使用 __COUNTER__ 宏来生成唯一的整数标识符。它运行良好,但我看到两个问题: 它不属于任何 C 或 C++ 标准。 也使用 __COUNTER__ 的独立代码可能会
__COUNTER__ 符号由 VC++ 提供和 GCC,每次使用都会给出一个递增的非负整数值。 我有兴趣了解是否有人使用过它,以及它是否值得标准化? 最佳答案 __COUNTER__ 在您需要唯一名
这个问题在这里已经有了答案: Does C++ support compile-time counters? (11 个答案) 关闭 6 年前。 我有一组 C++ 类,每个类都必须声明一个唯一的顺序
我需要在编译时在整个代码中生成一系列序列号。我以这样的方式尝试了“__COUNTER__”: void test1() { printf("test1(): Counter = %d\n", __
在this presentation 在 00:19:00 左右,Andrei Alexandrescu 解释了他的 SCOPE_EXIT 宏的实现。他在堆栈上创建了一个 ScopeGuard 对象,
我遇到以下关于 __COUNTER__ 的词: Care must be taken to ensure that __COUNTER__ is not expanded prior to inclu
首先,让我从我正在尝试做的事情开始。我正在开发一个库,它可以更轻松地将 Python 解释器嵌入到 C++ 代码中,并且我想利用一些 C++11 功能。我大量使用 std::functions,这是一
我是一名优秀的程序员,十分优秀!