Clang在哪里存储int32_t*p和int32_t p [10]之间的区别?

Mar*_*c-O 5 c c++ clang

我想确保这种类型的代码

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)

此签名f1f2示例中显示的签名不同.

  • @PaperBirdMaster我对此表示怀疑.我见过没有编译器这样做,因为在语言级别*没有大小信息*.如果你有一个反例,我有兴趣知道. (2认同)