相关疑难解决方法(0)

为什么C和C++编译器在从未强制实施时允许函数签名中的数组长度?

这是我在学习期间发现的:

#include<iostream>
using namespace std;
int dis(char a[1])
{
    int length = strlen(a);
    char c = a[2];
    return length;
}
int main()
{
    char b[4] = "abc";
    int c = dis(b);
    cout << c;
    return 0;
}  
Run Code Online (Sandbox Code Playgroud)

所以在变量中int dis(char a[1]),[1]似乎什么都不做,根本不起作用
,因为我可以使用a[2].就像int a[]char *a.我知道数组名称是一个指针,以及如何传达一个数组,所以我的谜题不是这个部分.

我想知道的是为什么编译器允许这种行为(int a[1]).或者它有其他我不知道的含义?

c c++ arrays

131
推荐指数
7
解决办法
9888
查看次数

GCC别名检查w /限制指针

请考虑以下两个片段:

#define ALIGN_BYTES 32
#define ASSUME_ALIGNED(x) x = __builtin_assume_aligned(x, ALIGN_BYTES)

void fn0(const float *restrict a0, const float *restrict a1,
         float *restrict b, int n)
{
    ASSUME_ALIGNED(a0); ASSUME_ALIGNED(a1); ASSUME_ALIGNED(b);

    for (int i = 0; i < n; ++i)
        b[i] = a0[i] + a1[i];
}

void fn1(const float *restrict *restrict a, float *restrict b, int n)
{
    ASSUME_ALIGNED(a[0]); ASSUME_ALIGNED(a[1]); ASSUME_ALIGNED(b);

    for (int i = 0; i < n; ++i)
        b[i] = a[0][i] + a[1][i];
}
Run Code Online (Sandbox Code Playgroud)

当我编译函数时,gcc-4.7.2 -Ofast -march=native -std=c99 -ftree-vectorizer-verbose=5 -S …

c optimization gcc strict-aliasing

35
推荐指数
1
解决办法
1602
查看次数

C99中那些奇怪的数组大小[*]和[静态]是什么?

显然,以下函数原型在C99和C11中有效:

void foo(int a[const *]);

void bar(int a[static volatile 10]);
Run Code Online (Sandbox Code Playgroud)

什么是那些奇怪的符号下标为目的*,static和CV预选赛?

它们有助于区分静态类型数组和可变长度数组吗?或者他们只是语法糖?

c arrays c99 function-prototypes c11

29
推荐指数
1
解决办法
1512
查看次数

函数原型中的顶级 volatile 或 limit 是否重要?

以下原型之间有什么实际区别吗?

void f(const int *p);

void f(const int *restrict p);

void f(const int *volatile p);
Run Code Online (Sandbox Code Playgroud)

C11 6.7.6.3/15 节(最后一句)指出,为了确定类型兼容性,不考虑顶级限定符,即允许函数定义在其参数上具有与原型不同的顶级限定符宣言了。

然而(与 C++ 不同)它并没有说它们被完全忽略。在这种情况下,const这显然是没有意义的;volatile然而,在和的情况下restrict也许可能存在差异。

例子:

void f(const int *restrict p);

int main()
{
     int a = 42;
     const int *p = &a;
     f(p);
     return a;
}
Run Code Online (Sandbox Code Playgroud)

原型中的存在是否restrict允许编译器优化afor的读取return a;

相关问题

c qualifiers language-lawyer restrict-qualifier

5
推荐指数
1
解决办法
571
查看次数