typedef 可以解析为两种类型中的一种,但对我来说似乎都不可能

Posted

技术标签:

【中文标题】typedef 可以解析为两种类型中的一种,但对我来说似乎都不可能【英文标题】:A typedef can resolve to one of two types, but both seem impossible to me 【发布时间】:2013-12-22 07:33:50 【问题描述】:

我在 RELIC 库中看到了这样定义的类型 (fb_t)(此处为文档 https://code.google.com/p/relic-toolkit/downloads/list):

#if ALLOC == AUTO
typedef align dig_t fb_t[FB_DIGS + PADDING(FB_BYTES)/(FB_DIGIT / 8)];
#else
typedef dig_t *fb_t;
#endif

align 定义为 /* empty */,如果重要的话)

所以它是一个指针,或者它是一个数组。但如果它是一个数组,那么这个函数将如何工作? (来自relic-doc/html/df/d96/relic__fb__util_8c_source.html#l00080

void fb_copy(fb_t c, const fb_t a) 
    for (int i = 0; i < FB_DIGS; i++) 
        c[i] = a[i];
    

如果它是一个指针,这段代码将如何工作(因为它们是未初始化的指针)?

//create two variables 
fb_t source, target;
fb_copy(target,source); //and copy one to the other

两者都在同一台计算机上运行。这台电脑上的sizeof(fb_t) 是 16。

【问题讨论】:

我只记得函数参数如何与数组类型一起使用。 【参考方案1】:

无论fb_t 是数组还是指针,上面的函数fb_copy 都能正常工作。那是因为数组和指针是等价的。

考虑一下(阅读 cmets):

    int a[10];
    int *ip;

    ip = a; 
    // this assignment is as if you have written ip = &a[0]
    // the first facet of equivalence

第二个是,您可以使用[i] 语法访问数组元素,也可以使用指针。

     int a = ip[3]
     //it is just as if you had written *(ip + 3)

通过等价,我们的意思是虽然指针和数组不同,但指针算术和数组索引是等价的和绑定的。

因此,在您指出的这种情况下,如果传递了该函数 initialized pointers ,它的作用相当于 *(c+i) = *(a+i)

【讨论】:

【参考方案2】:

但是如果它是一个数组,那么这个函数是如何工作的呢?

很好,谢谢。为什么它不起作用?

如果它是一个指针,这段代码将如何工作(因为它们是未初始化的指针)?

如果传递了未初始化的指针,它将不起作用(反而会导致未定义的行为)。

但是:我强烈怀疑,由于 typedef 依赖于 #ifdef(这似乎控制自动与动态内存分配),这种情况也以安全的方式涵盖(即当fb_t 被定义为指针时,代码中使用未初始化fb_t 对象的任何部分都将被排除在编译之外。)

【讨论】:

以上是关于typedef 可以解析为两种类型中的一种,但对我来说似乎都不可能的主要内容,如果未能解决你的问题,请参考以下文章

typedef 与 #define 的区别

如果两种类型不相同,则导致 C89 中的编译错误

typedef 和 #define 的区别

在 Python 中,是不是可以将函数参数的类型限制为两种可能的类型? [复制]

enum sizeof typedef分析

如何在一个 android studio 项目中为两种不同类型的用户提供两种不同的导航抽屉活动?