Tag: c99

何时使用限制,何时不使用

我对restrict有一般性的了解,但我希望澄清一些细节。 我有一个函数从一个缓冲区读取一个以null结尾的字符串,并在另一个缓冲区中写出一个URL编码的版本。 该函数具有此签名(目前没有restrict ): char const *StringUrlEncode(char const *unencoded, char *encoded, char *encodedEnd); unencoded是我的以null结尾的源字符串。 目标缓冲区由encoded和encodedEnd表示,其中encoded指向缓冲区中的第一个char , encodedEnd指向缓冲区后的第一个char,即函数将写入char ,但不包括 encodedEnd指向的位置 – – 如果您熟悉C ++ STL约定,这是您的基本begin / end迭代器对。 如果我将restrict添加到此函数,它是否应仅应用于前两个参数: char const *StringUrlEncode(char const *restrict unencoded, char *restrict encoded, char *encodedEnd); 或者通过将它添加到所有三个参数中我是否有一些好处? 我可以看到,使输入和输出缓冲区restrict有助于编译器知道它们不重叠。 但是由于最后一个参数encodedEnd仅用于标记输出缓冲区的结尾,我认为restrict对这里的编译器没有任何帮助(虽然我认为它不会伤害,除了添加function声明中不必要的噪音)。

c99和c11之间的差异

我正在学习c,现在。 我读的这本书是基于C99的。 我想在完成本书后将我的知识更新到C11,或者如果存在重大差异则更改资源。 因此,我要求的是更新我的知识的解释或资源。 我只发现了这个来源 。 然而,它似乎并不包含我需要或不简洁的信息。 提前致谢。 PS:我想学习C11,因为我认为它现在是普遍的标准。 如果没有,请通知我。

最有用的用户自制C-宏(在GCC中,也是C99)?

您认为哪种C宏最有用? 我找到了以下一个,我用它在C中进行矢量运算: #define v3_op_v3(x, op, y, z) {z[0]=x[0] op y[0]; \ z[1]=x[1] op y[1]; \ z[2]=x[2] op y[2];} 它的工作方式如下: v3_op_v3(vectorA, +, vectorB, vectorC); v3_op_v3(vectorE, *, vectorF, vectorJ); …

使用bool编译c代码而不使用c99标准

我试图在C中使用bool变量编译代码并且我已经包含了stdbool头但是当我编译它时我没有指定我想用c99标准编译它(因此它是用ANSI C编译的)标准)但无论如何它都有效。 我想知道为什么会这样? 这是代码: #include #include int main() { char name[20]; printf(“What’s your name ? “); gets(name); printf(“Nice to meet you %s.\n”, name); bool exit = false; char c; printf(“Do you wish to exit the program ? (Y/N) “); while (!exit) { c = getchar(); if (c == ‘\n’) { continue; } printf(“Do you wish […]

C中的Integral Promotion和Balancing有什么区别?

积分促销和平衡之间有什么区别。 我们可以在执行任何操作之前将任何类型转换为atleast int或unsigned int类型(逻辑运算符&&,||,!除外)以及更大类型(如果任何操作数的类型更大)比int?

C99可变长度arrays最大尺寸和尺寸function

我正在尝试在我的C代码中使用可变长度数组(VLA),并试图理解我们应该和不应该做什么。 我的函数有以下代码片段: void get_pdw_frame_usb(pdws_t *pdw_frame, pdw_io_t *pdw_io) { … unsigned char buf[pdw_io->packet_size]; unsigned char *pdw_buf; memset(buf, ‘\0’, sizeof(buf)); pdw_io是一个数据结构,其中包含packet_size ,其类型为size_t char数组buf用于存储usb批量传输数据包的内容 我试图在这里使用C99 VLA方法将其实例化为自动变量。 我正在努力确保其内容全部为零。 我有一些问题。 首先,如果pdw_io->packet_size设置为8(非常小),则将buf设置为合理的值,即使用gdb进行调试,我可以按如下方式检查: (gdb) p buf $27 = 0xbffe5be8 “\270”, 如果pdw_io->packet_size设置为12008(相当大),那么我得到以下看起来不太好的: (gdb) p buf $29 = 0xbffe2d08 “” 对于VLA,12008个字符是否太大? 或者也许gdb输出不值得担心,它看起来有点像它没有分配任何东西给我? 另外,在检查buf的大小时,我在以下两种情况下都会得到以下结果: (gdb) p sizeof(buf) $30 = 0 我原本预计在第一个实例中是8个,在第二个实例中是12008个 我认为应该可以通过VLA以这种方式使用sizeof函数,这是错误的吗? 我的问题是随后的usb批量传输失败了,我想尝试排除它可能与我使用VLA有关的事实,这对我来说是一个新的领域。 UPDATE 写下以下最小,完整且有希望validation的程序,以尝试确认我的观察结果: […]

模拟器/生成的开关语句范围,单位为c

在ac(99?)或Objective C switch语句中是否存在支持范围情况的hack? 我知道不支持写这样的东西: switch(x) case 1: case 2..10: case 11: 但我认为应该有一种使用#define宏生成代码的方法。 当然我可以用一个案例列表来定义一个宏,但我希望有更优雅的方式,如CASERANGE(x,x + 10),它会生成: case x case x+1 case x+2 它甚至可能吗?

“GNU C中的语句和声明”是否特定于GNU C?

表达式中的语句和声明是否特定于GNU C? 或者这个function也包含在C99标准中?

使用printf将int转换为char

我只是想知道以下是否是转换int以将其显示为char的正确方法 #include int main() { int x = 500; printf(“%hhd\n”, x); } 另外,从上面我想知道我是否应该执行以下操作来显示字符的值。 #include int main() { char c = ‘a’; printf(“%hhd\n”, c); } 或者只是printf(“%d\n”, c); 没事的? 所以,基本上我试图通过printf输出整数的第一个字节而不进行任何转换。

子表达式评估顺序

我在J.1未指明的行为下查看了SO / IEC 9899:201x : “The order in which subexpressions are evaluated and the order in which side effects take place, except as specified for the function-call (), &&, ||, ?:, and comma operators (6.5).” 这是否意味着 func1() + func2(); func2()可以在func1()之前执行,或者甚至在func1()期间执行?