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 可以解析为两种类型中的一种,但对我来说似乎都不可能的主要内容,如果未能解决你的问题,请参考以下文章