GNU C
文章平均质量分 65
GNU C系列
dadalaohua
这个作者很懒,什么都没留下…
展开
-
【学习笔记】预处理宏 GCC:粘贴 x 和 x 并不生成有效的预处理标记
这个宏在 VS 编译器中工作正常,但在 GCC 编译器上无法编译:错误:错误:粘贴 “/” 和 “includefile” 并没有生成有效的预处理标记对于一些 include 文件,它给出了错误:错误:粘贴 “includefile” 和 “.” 并没有生成有效的预处理令牌。翻译 2024-06-11 22:28:50 · 104 阅读 · 0 评论 -
【GNU笔记】【C扩展系列】参数数目可变的宏 Macros with a Variable Number of Arguments
在1999年的ISO C标准中,宏可以声明为接受可变数量的参数,就像函数一样。定义宏的语法类似于函数。fprintfstderr这里的“…”是一个可变参数在这种宏的调用中,它表示零个或多个标记,直到结束调用的右括号为止,包括任何逗号。这组标记将替换宏主体中出现的标识符。更多信息请参阅 CPP 手册。GCC 长期以来一直支持可变参数宏,并使用了一种不同的语法,允许你像其他任何参数一样为变量参数命名。fprintfstderr这在所有方面都等同于上面的 ISO C 示例,但可以说更具可读性和描述性。翻译 2023-02-05 17:21:52 · 174 阅读 · 0 评论 -
【GNU笔记】【C扩展系列】可变长度数组 Arrays of Variable Length
ISO C99 允许可变长度自动数组,作为扩展 GCC 在 C90 模式和 C++ 中接受它们。这些数组的声明与任何其他自动数组一样,但其长度不是常量表达式。存储空间在声明时被分配,并在包含声明的块作用域退出时释放。跳出或超出数组名称的作用域范围将释放存储空间。不允许跳入作用域范围;你会得到一条错误信息。作为一种扩展,GCC 接受可变长度数组作为结构体或联合体的成员。你可以使用函数alloca来获得类似于可变长度数组的效果。函数alloca在许多其他的 C 实现中可用(但不是全部)。翻译 2023-01-14 16:44:59 · 188 阅读 · 0 评论 -
【GNU笔记】【C扩展系列】无成员的结构体 Structures with No Members
GCC 允许 C 结构体没有成员:该结构体的大小为零。在 C++ 中,空结构体是语言的一部分。 G++ 将空结构体视为有一个 类型的成员。6.19 Structures with No Members本文链接:https://blog.csdn.net/u012028275/article/details/125570564......翻译 2022-08-09 23:19:02 · 370 阅读 · 0 评论 -
【GNU笔记】【C扩展系列】 长度为零的数组 Arrays of Length Zero
【GNU笔记】【C扩展系列】 长度为零的数组 Arrays of Length ZeroArrays of Length Zero 长度为零的数组在 GNU C 中,声明零长度数组被允许作为一种扩展。零长度数组可以作为一个结构体的最后一个元素来使用,这个结构体实际上是一个可变长度对象的头。struct line { int length; char contents[0];};struct line *thisline = (struct line *) malloc (sizeof翻译 2022-07-02 10:54:26 · 520 阅读 · 0 评论 -
【GNU笔记】【C扩展系列】复数 Complex Numbers
【GNU笔记】【C扩展系列】复数 Complex Numbers复数 Complex NumbersISO C99支持复数的浮点数据类型(complex floating data types),作为扩展,GCC在C90模式和C++中支持它们。GCC 还支持不属于 ISO C99 的复数整数数据类型(complex integer data types)。你可以使用关键字_Complex来声明复数类型。作为扩展,旧的GNU关键字__complex__也被支持。例如,_Complex double x;翻译 2022-04-24 23:48:29 · 359 阅读 · 0 评论 -
【GNU笔记】内联函数与宏一样快 An Inline Function is As Fast As a Macro
内联函数与宏一样快 An Inline Function is As Fast As a Macro通过声明内联函数,你可以指示 GCC 更快地调用该函数。GCC 可以实现这一点的一种方法是将该函数的代码集成到其调用者的代码中。这通过消除函数调用开销使执行速度更快;此外,如果任何实际参数值是常量,则它们的已知值可能允许在编译时进行简化,因此不需要包含所有内联函数的代码。对代码大小的影响是难以预测的;根据具体情况,使用内联函数的目标代码可能更大或更小。你还可以指示 GCC 尝试使用选项 -finline-f翻译 2022-04-16 09:28:43 · 324 阅读 · 0 评论 -
【GNU笔记】【C扩展系列】双字整数 Double-Word Integers
【GNU笔记】【C扩展系列】双字整数 Double-Word Integers双字整数 Double-Word IntegersISO C99和ISO C++11支持至少64位宽的整数的数据类型,作为扩展,GCC在C90和C++98模式下支持它们。对于有符号的整数,只需写long long int,对于无符号的整数,只需写unsigned long long int。要使一个整数常量成为long long int类型,需要在整数上添加后缀’LL’。要使一个整数常量成为 unsigned long lon翻译 2022-03-01 22:05:51 · 342 阅读 · 0 评论 -
【GNU笔记】【C扩展系列】128位整数 128-bit Integers
【GNU笔记】【C扩展系列】128位整数 128-bit Integers128位整数 128-bit Integers作为扩展,整数标量类型__int128支持用于整数模式宽度足以容纳 128 位的目标。对于有符号的128位整数,只需写__int128;对于无符号的128位整数,只需写无符号unsigned __int128。对于宽度小于128位的long long整数的目标,GCC不支持表示整数常数为类型__int128。[参考资料]6.9 128-bit Integers...翻译 2022-02-18 16:18:17 · 3067 阅读 · 0 评论 -
【GNU笔记】【C扩展系列】省略操作数的条件句 Conditionals with Omitted Operands
【GNU笔记】【C扩展系列】省略操作数的条件句 Conditionals with Omitted Operands省略操作数的条件句 Conditionals with Omitted Operands条件表达式中的中间操作数可以省略。那么如果第一个操作数为非零,则其值为条件表达式的值。因此,表达式x ? : y如果x是非零值,则为x的值;否则,为y的值。这个例子完全等同于x ? x : y在这种简单的情况下,省略中间操作数的能力并不是特别有用。当第一个操作数确定或可能(如果是宏参数)翻译 2021-08-08 17:33:26 · 179 阅读 · 0 评论 -
【GNU笔记】【C扩展系列】用typeof来引用一个类型 Referring to a Type with typeof
【GNU笔记】【C扩展系列】用typeof来引用一个类型 Referring to a Type with typeof用typeof来引用一个类型 Referring to a Type with typeof引用表达式类型的另一种方法是使用typeof. 使用这个关键字的语法看起来像sizeof,但是这个结构在语义上的作用就像用typedef定义的类型名称。有两种方法来写typeof的参数:用表达式或用类型。下面是一个使用表达式的例子。typeof (x[0](1))这假设x是一个指向函数的翻译 2021-08-01 16:23:49 · 521 阅读 · 0 评论 -
【GNU笔记】【C扩展系列】构造函数调用Constructing Function Calls
【GNU笔记】【C扩展系列】构造函数调用Constructing Function Calls构造函数调用 Constructing Function Calls使用下面描述的内置函数,你可以记录一个函数接收到的参数,并以相同的参数调用另一个函数,而不知道参数的数量或类型。你也可以记录该函数调用的返回值,然后返回该值,而不知道该函数试图返回的数据类型(只要你的调用者期望有该数据类型)。然而,这些内置函数可能与一些复杂的特性或语言的其他扩展发生不良的交互。因此,不建议在非常简单的函数之外使用它们,因为翻译 2021-07-23 23:46:01 · 209 阅读 · 0 评论 -
【GNU笔记】【C扩展系列】非局部Goto
【GNU笔记】【C扩展系列】非局部Goto Nonlocal Gotos非局部Goto Nonlocal GotosGCC提供了内置函数__builtin_setjmp和__builtin_longjmp,它们与C库函数setjmp和longjmp类似,但不能互换。内置版本被GCC的库内部使用,用于在某些目标上实现异常处理。你应该在用户代码中使用<setjmp.h>中声明的标准C库函数,而不是内置版本。这些函数的内置版本使用GCC的正常机制,在函数进入和退出时使用堆栈保存和恢复寄存器。跳转翻译 2021-07-16 23:03:11 · 227 阅读 · 0 评论 -
【GNU笔记】【C扩展系列】嵌套函数
【GNU笔记】【C扩展系列】嵌套函数 Nested Functions嵌套函数 Nested Functions嵌套函数是在另一个函数里面定义的函数。嵌套函数作为GNU C中的一个扩展来支持,但GNU C++不支持。嵌套函数的名称对于定义它的块来说是局部的。例如,在这里我们定义了一个名为square的嵌套函数,并调用了两次。foo (double a, double b){ double square (double z) { return z * z; } return square翻译 2021-07-14 23:55:59 · 232 阅读 · 0 评论 -
【GNU笔记】【C扩展系列】标签作为值
【GNU笔记】【C扩展系列】标签作为值 Labels as Values标签作为值 Labels as Values你可以使用一元运算符“&&”获取当前函数(或包含函数)中定义的标签的地址。值的类型为void *。这个值是一个常量,可以在该类型的常量有效的任何地方使用。例如:void *ptr;/* … */ptr = &&foo;要使用这些值,你需要能够跳转到一个值。这可以通过计算goto(computed goto)语句1,goto *exp;来实现。比如说。翻译 2021-07-10 23:21:10 · 241 阅读 · 0 评论 -
【GNU笔记】【C扩展系列】局部声明的标签
【GNU笔记】【C扩展系列】局部声明的标签 Locally Declared Labels局部声明的标签 Locally Declared LabelsGCC 允许你在任何嵌套块范围内声明局部标签。局部标签就像普通标签一样,但你只能在声明它的块中引用它(使用goto语句,或者通过获取其地址)。局部标签声明如下所示:__label__ label;或者__label__ label1, label2, /* … */;局部标签声明必须位于块的开头,在任何普通声明或语句之前。标签声明定义了标签名翻译 2021-07-06 21:46:07 · 289 阅读 · 2 评论 -
【GNU笔记】【C扩展系列】表达式中的语句和声明
【GNU笔记】【C扩展系列】表达式中的语句和声明 Statements and Declarations in Expressions表达式中的语句和声明 Statements and Declarations in Expressions在GNU C中,用括号括起来的复合语句可以作为一个表达式出现。这允许你在表达式中使用循环(loops)、switches和局部变量(local variables)。回顾一下,复合语句是一个由大括号包围的语句序列;在这个结构(construct)中,小括号括在大括号翻译 2021-07-04 20:48:31 · 270 阅读 · 0 评论