c99相关内容
假设如下: unsigned char foo = 3;无符号字符条 = 5;无符号整数 shmoo = foo + bar; foo 和 bar 值是否保证被提升为 int 值以评估表达式 foo + bar -- 或者是否允许实现将它们提升为 unsigned int? 在第 6.2.5 节第 8 段: 对于任意两个具有相同符号和不同整数转换等级的整数类型(见 6.3.1.1)
..
考虑以下行: char *p = malloc( sizeof(char) * ( len + 1 ) ); 为什么要使用 sizeof(char)?这没有必要,不是吗?还是只是风格问题? 它有什么优势? 解决方案 是的,这是风格问题,因为您希望 sizeof(char) 始终为一. 另一方面,在执行 malloc 时使用 sizeof(foo) 是一种习惯用法,最重要的是
..
C99 的第 5.2.4.2.1 节将 SCHAR_MIN 定义为 -127,将 SCHAR_MAX 定义为 127.8 位有符号整数的范围不应该是 -128 到 +127? 我的编译器的 limits.h 将 SCHAR_MIN 定义为 (-1
..
是否有机器(或编译器),其中 sizeof(char) != 1? C99 标准 是否规定标准合规实施上的 sizeof(char) 必须正好为 1?如果有,请给我章节号和引文. 更新:如果我有一台机器(CPU),它不能寻址字节(最小读取是 4 个字节,对齐),但只有 4-s 字节(uint32_t),可以为此编译机器将 sizeof(char) 定义为 4? sizeof(char)
..
Visual Studio 的最新版本改进了对 C99 的支持.最新版本 VS2017 现在支持所有 C99 了吗? 如果没有,C99 还缺少哪些功能? 解决方案 没有. https://docs.microsoft.com/en-us/cpp/visual-cpp-language-conformance Visual Studio 2017 中编译器对 C99 预处理
..
人们总是说宏是不安全的,而且它们没有(直接)对其参数进行类型检查,等等.更糟糕的是:当发生错误时,编译器会给出复杂且难以理解的诊断,因为宏只是一团糟. 是否有可能以与函数几乎相同的方式使用宏,通过进行安全的类型检查,避免典型的陷阱,并且以某种方式编译器给出正确诊断. 我将以肯定的方式回答这个问题(自动回答). 我想向您展示我为这个问题找到的解决方案. 将使用和尊重标准 C99,以具
..
我想以一种方式在 C99 中做某事,否则以另一种方式执行.要检查的 #define 是什么? #ifdef C99...#别的...#万一 解决方案 没有特定的 #define 值.只需检查 __STDC_VERSION__ 并自己定义!;-) #if __STDC_VERSION__ >= 199901L/* C99 代码 */#定义C99#别的/* 不是 C99 代码 */#万一#if
..
我目前使用的是 Xcode 4,在我的 .pch 文件中有这个宏:#define localize(s) NSLocalizedString((s), nil). 当我尝试在某个 .m 文件中使用此宏时,我收到以下警告:函数“localize"的隐式声明在 C99 中无效. 这段代码编译没有问题,但我怎样才能解决这个问题,以免收到警告? 解决方案 我在用 DLog 全局替换 NSL
..
是否允许 C 编译器向标准头文件添加函数并仍符合 C 标准? 我在某处读过这个,但我在标准中找不到任何参考,除了附件 J.5: 包含任何可能导致严格符合的扩展程序变为无效会导致实现不合格.此类扩展的示例是新关键字、额外的库函数在标准头文件中声明,或名称为的预定义宏不能以下划线开头. 但是,附件 J 提供信息而不是规范......所以它没有帮助. 所以我想知道一个符合标准的编
..
我想在项目中定义一个内联函数,用c99编译.我该怎么做?当我在头文件中声明函数并在 .c 文件中提供详细信息时,其他文件无法识别该定义.当我将显式函数放在头文件中时,我遇到了问题,因为使用它的所有 .o 文件都有定义的副本,因此链接器给了我一个“多重定义"错误. 我想做的是这样的: header.h内联无效函数(){做事...}lib1.c#include "header.h"...lib
..
当唯一允许使用的浮点指令是 387 时,几乎不可能 (*) 以合理的成本提供严格的 IEEE 754 语义.当希望保持 FPU 在完整的 64 位有效位上工作以便 long double 类型可用于扩展精度时,尤其困难.通常的“解决方案"是以唯一可用的精度进行中间计算,并在或多或少定义明确的情况下转换为较低的精度. 最新版本的 GCC 根据 Joseph S. Myers 在 2008 年发
..
我正在树莓派上编写一些串行代码并切换到 C99.当我这样做时,我开始收到错误消息“错误:‘CRTSCTS’未声明(首次在此函数中使用)" $ c99 -M serial01.c |grep termios.h/usr/include/termios.h/usr/include/arm-linux-gnueabihf/bits/termios.h \$ gcc -M serial01.c |gre
..
我最近学习了如何编写简单的字符驱动程序,在尝试编写代码时,我注意到我的 C99 代码收到了很多以下 GCC 警告: warning: ISO C90 禁止混合声明和代码 我认为这是因为主 Linux 内核 Makefile 设置为使用非 C99 标准进行编译.我四处搜索我在stackoverflow上找到了这个答案:How使用 make 并编译为 C99? 所以我很自然地在我的 Make
..
考虑由两个文件组成的C程序, f1.c: int x; f2.c: int x=2; 我阅读了 C99 的第 6.9.2 段标准是这个程序应该被拒绝.在我对 6.9.2 的解释中,变量 x 是在 f1.c 中临时定义的,但是这个临时定义在翻译单元的末尾变成了实际定义,并且(在我看来),因此应该表现得好像 f1.c 包含定义 int x=0;. 使用我能够尝试的所有编译器(以及重
..
事实证明,我们可以通过指定来防止出现僵尸进程(即,其父进程没有 wait() 等待它到 _exit())SIGCHLD 信号被其父级用 sigaction() 忽略.然而,似乎 SIGCHLD 在默认情况下被忽略.这是怎么回事? int main (void) {struct sigaction sa;sa.sa_handler = SIG_IGN;//通过忽略处理信号sigemptyset(&
..
在查看 Linux 内核对双向循环列表的实现时,我发现了以下宏: #define container_of(ptr, type, member) ({ \const typeof( ((type *)0)->member ) *__mptr = (ptr);\(type *)( (char *)__mptr - offsetof(type,member) );}) 它的工作方式是仅在给定其成员
..
我知道如何使用 malloc() 和 free() 来分配内存,但是是否也有一个标准的 C 函数来检查剩余多少内存,所以我可以定期调用它以确保我的代码没有内存泄漏? 我唯一能想到的就是在无限循环中调用 malloc(1) 直到它返回错误,但不应该有更有效的方法吗? 解决方案 不,没有标准的 C 函数可以做到这一点.您可以使用一些特定于平台的函数来执行某些类型的查询(例如工作集大小),
..
我看到了下面一些复杂的函数定义. void foo(double A[static 10]) {双 B[10];} C & 是否有效?C++代码?它是 C99 或 C++ 标准引入的新语法吗?它的目的是什么?我应该什么时候使用它?这有什么必要? 解决方案 这个 C99 符号,void foo(double A[static 10]),意味着函数可以假设 A 指向 10 个有效参数(从
..
enum 类型是有符号的还是无符号的?枚举的符号性是否不同:C/C99/ANSI C/C++/C++x/GNU C/GNU C99? 谢谢 解决方案 枚举保证由整数表示,但实际类型(及其符号)取决于实现. 您可以通过为枚举器之一赋予负值来强制枚举由有符号类型表示: enum SignedEnum { a = -1 }; 在 C++0x 中,可以显式指定枚举的基础类型: e
..
在 32 位系统上,如果以二进制模式打开的文件的当前位置指示器超过 2GB 点,ftell 返回什么?在 C99 标准中,这是 未定义的行为,因为 ftell 必须返回一个 long int(最大值为 2**31-1)? 解决方案 on long int long int 应该是至少 32 位,但 C99 标准并没有将其限制为 32 位.C99 标准确实提供了方便的类型,例如 int
..