C预处理程序指针混乱

布赖恩

我正在尝试避免在静态表中出现问题,其中一个表引用另一个表引用原始表。编译器抱怨找不到表成员之一的定义。为了解决该问题,我一直在模拟一些测试代码,这些方法是否行得通?像我正在尝试做的事情是否可能?

以下是供参考的代码:

#define SWIZTBLMAX 256

#define TERM( NAME , ...) \
    static cli_term NAME { __VA_ARGS__ }; swizzle_tbl[__COUNTER__] = { &NAME, "NAME" };

typedef struct cli_term
{
    char* name;
    cli_term* parent;
    cli_term* child;
}cli_termt;

typedef struct swiz_ent
{
    cli_term* t;
    char* n;
}swiz_ent;

static swiz_ent swizzle_tbl[SWIZTBLMAX];

static cli_term* swizzle(const char* n)
{
    int i;
    for(i=0;i<SWIZTBLMAX;i++)
    {
        if(strcmp(n,swizzle_tbl[i].n)==0)
            return swizzle_tbl[i].t;
    }
return NULL;
}

TERM( ct_show_test, "test",  swizzle("ct_show"), NULL )
TERM( ct_quit, "quit", NULL, NULL )
TERM( ct_show, "show", NULL, swizzle("ct_show_test") )

因此,我的想法是将指针分配推迟到运行时,在将对象写入磁盘和回写时,我做过类似的事情。有什么办法可以创建这样的静态表?(带有指向静态分配的其他结构的指针)

乔纳森·莱夫勒

您的TERM宏不能在函数范围之外使用,因为它会尝试编写赋值而不是声明:

#define TERM( NAME , ...) \
    static cli_term NAME { __VA_ARGS__ }; \
    swizzle_tbl[__COUNTER__] = { &NAME, "NAME" };

swizzle_tbl[__COUNTER__]是一个赋值; 您不能在函数外部进行分配。还必须升级它以分配复合文字:

#define TERM( NAME , ...) \
    static cli_term NAME { __VA_ARGS__ }; \
    swizzle_tbl[__COUNTER__] = (swiz_ent){ &NAME, "NAME" };

TERM一个函数内部可能会或可能不会帮助; 静态cli_term变量只能通过外部访问swizzle_tbl这可能是一件好事。如果其他都可以(不需要通过名称访问数据),则应该可以。

您需要考虑做什么__COUNTER__它不是标准C的一部分,因此不可移植。您可以在函数中使用局部变量代替__COUNTER__

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

#define之外的C预处理程序串联

来自分类Dev

for循环中的C预处理程序串联

来自分类Dev

C预处理程序是否在运行?

来自分类Dev

扩展单个C预处理程序指令

来自分类Dev

C预处理程序是否删除“&*”的实例?

来自分类Dev

C预处理程序:及早评估宏

来自分类Dev

C ++预处理程序串联操作

来自分类Dev

C预处理程序删除结尾的逗号

来自分类Dev

C预处理程序宏扩展串联

来自分类Dev

C中的预处理程序指令

来自分类Dev

C预处理程序宏多个参数

来自分类Dev

C预处理程序的默认添加

来自分类Dev

C预处理程序指令和链接

来自分类Dev

解释C预处理程序代码

来自分类Dev

C预处理程序如何工作?

来自分类Dev

C预处理程序宏扩展串联

来自分类Dev

C预处理程序:动态#Define创建

来自分类Dev

C预处理程序是否在运行?

来自分类Dev

C预处理程序如何处理循环依赖关系?

来自分类Dev

此预处理程序指令C / C ++所需的说明

来自分类Dev

此预处理程序指令C / C ++所需的解释

来自分类Dev

Roberta模型的预处理文本中的混乱

来自分类Dev

C ++预处理程序位置代码:: blocks?

来自分类Dev

此无括号的C预处理程序定义安全吗?

来自分类Dev

C预处理程序优先级

来自分类Dev

保存C ++预处理程序宏的原始值

来自分类Dev

C预处理程序:__ COUNTER__的自己的实现

来自分类Dev

C预处理程序实际上是如何工作的?

来自分类Dev

如何为C#预处理程序符号定义值?