Tag: c99

在Windows PowerShell中为GCC设置别名

我正在尝试在Windows PowerShell中设置一个“gcc99”别名,它等于“gcc -std = C99 -pedantic -Wall”。 我们的想法是使用更少的击键来确保GCC以c99模式运行。 (我已尽力使以下post中的指南适应Windows PowerShell: 在GCC中设置std = c99标志 ) 当我在设置这样的别名(下面的图1)后尝试编译时,我收到一个错误。 作为参考,如果我使用扩展命令进行编译,我不会收到此错误(参见下面的图2)。 作为测试,我尝试将gc99设置为“gcc”的别名(没有其他值)并且它工作正常(参见下面的3)。 请忽略我在代码中尚未解决的许多警告:) 有什么建议? (我不确定为什么我的字幕没有出现在下面的图片中。我正在使用自动创建的图片格式,例如,对于第一张图片:“ 标题 ”后面跟着“ 1 :链接”下一行。)

在C中使用`inline`关键字有什么用?

我在stackoverflow中读了几个关于C中inline问题,但仍然不清楚。 static inline void f(void) {}与static void f(void) {}没有实际区别。 inline void f(void) {}不能像C ++那样工作。 它在C中如何工作? 实际上extern inline void f(void); 做? 我从来没有真正在我的C程序中使用inline关键字,当我在其他人的代码中看到这个关键字时,它几乎总是static inline ,其中我看到只有static没有区别。

如何将printf()包装到函数或宏中?

这听起来有点像面试问题,但实际上是一个实际问题。 我正在使用嵌入式平台,并且仅提供这​​些function的等价物: 的printf() 的snprintf() 此外,printf()实现(和签名)很可能在不久的将来发生变化,因此对它的调用必须驻留在一个单独的模块中,以便以后易于迁移。 鉴于这些,我可以在某些函数或宏中包装日志记录调用吗? 目标是我的源代码调用THAT_MACRO(“Number of bunnies: %d”, numBunnies); 在一千个地方,但只能在一个地方看到对上述function的调用。 编译器:arm-gcc -std = c99

为什么fgets函数已被弃用?

来自GNU C编程教程 : fgets (“file get string”)函数类似于gets函数。 这个函数已被弃用 – 这意味着它已经过时,强烈建议您不要使用它 – 因为它很危险。 这很危险,因为如果输入数据包含空字符,则无法分辨。 除非您知道数据不能包含null,否则不要使用fgets 。 不要使用它来读取用户编辑的文件,因为如果用户插入空字符,您应该正确处理它或打印清晰的错误消息。 如果可以,请始终使用getline或getdelim而不是fgets 。 我认为fgets函数遇到\0或\n时会停止; 当fgets应该正确处理输入时,为什么这个手册页建议空字节是“危险的”? 此外, getline和fgets之间的区别是什么,并且在C99或未来的C标准中真正被认为已弃用的fgets函数是什么?

C,从单输入线读取多个数字(scanf?)

我在C中编写了一个应用程序,它需要输入两行。 第一个输入表示int数组的大小,第二个输入包含由空格分隔的值。 例如,以下输入 5 1 2 3 4 99 应该创建一个包含{1,2,3,4,99}的数组 最快的方法是什么? 我的问题是读取多个数字而不循环遍历整个字符串检查它是空格还是数字? 谢谢。

创建使用getaddrinfo的静态链接二进制文件?

我已经包含了头文件netdb.h ,其中包含了getaddrinfo ,但是gcc发出了这个警告: warning: Using ‘getaddrinfo’ in statically linked applications requires at runtime the shared libraries from the glibc version used for linking gcc -m32 -static -s -O2 -std=c99 -D_POSIX_C_SOURCE=200112L myprogram.c 如何静态编译丢失的文件? 可能的解决方案: 可能是glibc安装缺少静态编译所需的相应目标文件。 如果是这种情况,请创建相应的目标文件并在编译时链接它。 尝试EGLIBC而不是glibc。 我成功地用dietlibc编译了我的程序,它编译时没有任何错误加上得到的二进制文件比glibc制作的要小得多。

定义中函数标题后的C变量声明

在阅读一些FreeBSD源代码时(参见: radix.h第158-173行),我发现了定义中“函数标题”之后的变量声明。 这在ISO C(C99)中有效吗? 什么时候应该在生产代码中完成而不是仅仅在“函数标题”中声明变量? 为什么要在这里完成? 我指的是标题字符串的函数,如下所示: int someFunction(int i, int b) {

如何将复合文字用于`fprintf()`具有任意碱基的多个格式化数字?

我想将多个数字转换为某种表示forms,然后使用*printf()说明符的标志,宽度和精度。 首选是避免全局或static缓冲区。 关键问题似乎是如何为每个转换后的数字提供char[] ? fprintf(ostream, “some_format”, foo(int_a, base_x), foo(int_b, base_y), …); 如何使用C11复合文字来解决这个问题? 如何使用C99(或更高版本)复合文字来解决这个问题?

独立实现和托管实现之间是否存在有意义的区别?

我的问题主要涉及第四节第六段 。 这两种符合实施forms是托管和独立的。 符合要求的托管实施应接受任何严格符合的程序。 据我了解,这构成了典型的应用程序环境,包括文件系统,分配内存和线程…… 符合标准的独立实现应接受任何严格符合的程序,其中库子句(第7节)中指定的特性的使用仅限于标准头文件 , , , , , , , 和 。 ……这构成了典型的内核和/或嵌入式,最小环境, 没有标准文件系统,分配内存或线程(以及其他内容)。 符合条件的实现可能具有扩展(包括附加库函数),前提是它们不会改变任何严格符合程序的行为。 似乎这为托管实现提供了自由调用托管或独立实现的自由,当涉及文件系统,分配内存或线程(以及其他内容)时,这些可以属于扩展类别,因此它只能实现一个接口,每次都返回一个指示错误的值。 仅举几个: fopen , fgets和malloc可以返回NULL fprintf , fscanf , fputc和fgetc可以返回EOF thrd_create可以返回thrd_error (表示“请求无法兑现”) 这意味着区分第四节第六段给出的内容实际上毫无意义。 是否有任何要求保证托管和独立实施中这些function的某些实际function级别? 例如,是否要求上述函数实际上能够返回除相应故障值之外的其他函数?

c99转到过去的初始化

在调试崩溃时,我在一些代码中遇到了这个问题: int func() { char *p1 = malloc(…); if (p1 == NULL) goto err_exit; char *p2 = malloc(…); if (p2 == NULL) goto err_exit; … err_exit: free(p2); free(p1); return -1; } 第一个malloc失败时会出现此问题。 因为我们跳过p2的初始化,它包含随机数据,并且对free(p2)的调用可能会崩溃。 我希望/希望这将与C ++中的方式相同,其中编译器不允许goto跳过初始化。 我的问题:是跳过标准允许的初始化还是这是gcc实现c99的错误?