我想确保这种类型的代码
void f1 (int32_t p[10]);
void f2 (int32_t *p);
void b ()
{
int_32_t a[10];
f1(a);
f2(a);
}
Run Code Online (Sandbox Code Playgroud)
当有人编码时不会发生,因为当使用f2()时,您可能会丢失有关数组边界的信息.它是MISRA标准规则之一.
但AST-dump在2个函数声明之间没有区别:
|-FunctionDecl 0x2204140 <test.cpp:3:1, col:23> f1 'void (int32_t *)'
| -ParmVarDecl 0x2204040 <col:10, col:22> p 'int32_t *'
|-FunctionDecl 0x2204280 <line:4:1, col:20> f2 'void (int32_t *)'
| -ParmVarDecl 0x2204200 <col:10, col:19> p 'int32_t *'
Run Code Online (Sandbox Code Playgroud)
我猜Clang确实记录了数组(10)的大小,但AST-dump似乎告诉了相反的情况.
有没有办法区分?
jua*_*nza 10
这个问题似乎是基于一种误解.这个函数声明
void f1 (int32_t p[10]);
Run Code Online (Sandbox Code Playgroud)
与...完全相同
void f1 (int32_t* p);
Run Code Online (Sandbox Code Playgroud)
在两种情况下,参数都是指针.任何地方都没有尺寸信息.
请注意,在C++中,您可以拥有对特定大小的数组的引用的函数参数.例如,
void f3(int (&p)[10]);
Run Code Online (Sandbox Code Playgroud)
此签名f1与f2示例中显示的签名不同.
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |