当前位置: 首页 > 面试题库 >

[N…M]在C聚合初始化程序中是什么意思?

齐振
2023-03-14
问题内容

从sys.c第123行:

void *sys_call_table[__NR_syscalls] = 
{
    [0 ... __NR_syscalls-1] = sys_ni_syscall,
#include <asm/unistd.h>
};

sys_call_table是数组的通用指针,我可以看到。但是,表示法是什么:

[0 ... __NR_syscalls-1]

什么是...

编辑:
我在这里学到了另一个C技巧:#include <asm/unistd.h>将被 预处理 并替换为其内容并分配给[0 ... _NR_syscalls-1]


问题答案:

使用 指定的初始化 程序进行
初始化

基于范围的初始化是gnu gcc扩展。

要将一系列元素初始化为相同的值,请写入[first ... last] = value。这是一个GNU扩展。例如,

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

它不是便携式的。编译与-pedantic告诉您。

它在这里如何运作?
预处理器在基于范围的构造中替换#include <asm/unistd.h>为其实际内容( 它定义了各种符号常量和类型,并声明了各种函数
),然后将其进一步用于初始化指针数组。



 类似资料:
  • 问题内容: 这是我的代码: 现在的问题是,在初始化程序块中 如果我在之前添加关键字,则可以,但是缺少关键字时会出现错误。 编译器说: 他们为什么不一样? 问题答案: 我不了解设计原理,但可能有助于阅读Java语言规范的相关部分。 8.6。 实例初始化器 实例初始化器可以通过关键字(§15.8.3)引用当前对象,使用关键字(§15.11.2,§15.12),并使用范围内的任何类型变量。 有时会限制使

  • 我试图理解@bolov对删除默认构造函数问题的第一个公认答案。对象仍然可以创建......有时[1] 似乎我发现了一个错误,所以它搞乱了整个解释。 @bolov解释了为什么这段代码能够在c 11中成功编译: 场景A 以及为什么这段代码无法在c 11中编译: 场景C 他说,重点是第一个foo是聚合,第二个foo不是聚合。 然后他给出了cppreference的摘录: T类型对象的列表初始化的影响是:

  • 根据此堆栈溢出问题的公认(且唯一)答案, 使用 将改为零初始化对象。 那么,为什么呢?, 生成此输出: 定义的两个构造函数都是默认的?正当对于POD类型,默认初始化为零初始化。 根据这个问题的公认答案, 如果POD成员未在构造函数中初始化,也未在类初始化中通过C11初始化,则默认为已初始化。 不管是堆栈还是堆,答案都是一样的。 在C 98中(而不是之后),new int()被指定为执行零初始化。

  • 非常接近这个SO帖子,并在评论中询问,但在那里留下了不清楚。 和后缀是什么意思?

  • N4527 8.5.3[dcl初始参考] 5对“cv1 T1”类型的引用由“cv2 T2”类型的表达式初始化,如下所示: (5.1)-[...] (5.1.1)-[...] (5.1.2)-[...] (5.2)-否则,引用应该是对非易失性const类型的左值引用(即cv1应该是const),或者引用应该是右值引用。 (5.2.1)-如果初始化表达式 (5.2.1.1)-是一个xvalue(但不是