C typedef'的地址;当数组是另一个函数';s形式参数
我已经阅读并搜索了更多信息,但大多数人只是说“不要像这样使用typedef”。这种做事方式对我很有吸引力,我也在尝试学习新东西,所以我想坚持下去 我使用的是gcc版本9.2.1 以下是我所做工作的一个最小可复制示例:C typedef'的地址;当数组是另一个函数';s形式参数,c,arrays,pointers,typedef,C,Arrays,Pointers,Typedef,我已经阅读并搜索了更多信息,但大多数人只是说“不要像这样使用typedef”。这种做事方式对我很有吸引力,我也在尝试学习新东西,所以我想坚持下去 我使用的是gcc版本9.2.1 以下是我所做工作的一个最小可复制示例: #定义表_sz10 typedef int vec_t[3]; 类型定义结构{ vec_t table_one[table_SZ]; }表格; 无效foo(vec_t*foo_vec){ (*foo_vec)[0]=0; } 空栏(表格栏、向量栏、向量栏){ foo(&(bar_t
#定义表_sz10
typedef int vec_t[3];
类型定义结构{
vec_t table_one[table_SZ];
}表格;
无效foo(vec_t*foo_vec){
(*foo_vec)[0]=0;
}
空栏(表格栏、向量栏、向量栏){
foo(&(bar_table.table_one[0]);
foo(和bar_vec);
}
int main(){
向量;
foo&vector;
}
我假设这与“指针衰减”有关,我猜是bar将bar_vec转换为int**?
具体地说,当bar\u vec为int**时,&(bar\u table.table\u one[0])int(*)[3]的类型为何
很明显,我不想禁止gcc中所有不兼容的指针类型警告。投下指针似乎是一个难题。 我想保留typedef。我不想把它隐藏在结构中 是否有编译器标志或其他解决方案来告诉编译器按照我的预期处理这种情况? 关于这一点,我是否应该知道更多的信息 多谢各位 p、 堆栈溢出对编译器输出有很好的打印效果吗?
无效条(tables bar\u table,vec\u t bar\u vec)
在许多方面都不好:
- 通过值传递struct,如果函数位于不同的翻译单元中,则该值非常无效,编译器无法对其进行优化李>
不会阻止数组类型在作为参数传递时进行调整(“衰减”),因此typedef vec\u t
相当于vec\u t bar\u vec
。因此,这个数组不是按值传递的,而是按地址传递的int*
foo(&bar\u-vec)代码>。传递一个指向隐藏在typedef下面的int*
的指针,这意味着传递一个int**
。但是,该函数需要一个vec\u t*
,表示int(*)[3]
类型的数组指针。这就是编译器告诉你的
没有编译器标志来解决这个问题,因为代码没有任何意义。解决这个问题的方法是去掉typedef,然后重写代码。永远不要在typedef后面隐藏指针或数组。这是一个普遍的坏习惯,听人们告诉你要这样做。为什么?因为你现在写的代码你不知道它是做什么的,不能让它编译,你也不知道为什么。难道您不希望有您理解的代码,可以编译和运行吗?
/home/happy/CLionProjects/os_2019_p5/tests/test_array_typedef_ops.c: In function ‘bar’:
/home/happy/CLionProjects/os_2019_p5/tests/test_array_typedef_ops.c:18:7: warning: passing argument 1 of ‘foo’ from incompatible pointer type [-Wincompatible-pointer-types]
18 | foo(&bar_vec);
| ^~~~~~~~
| |
| int **
/home/happy/CLionProjects/os_2019_p5/tests/test_array_typedef_ops.c:12:18: note: expected ‘int (*)[3]’ but argument is of type ‘int **’
12 | void foo(vec_t * foo_vec) {
| ~~~~~~~~^~~~~~~