首页 文章
  • 18 votes
     answers
     views

    什么ABI,如果有的话,限制[u] intmax_t的大小?

    从1999版开始,ISO C标准定义了一个标准头 <stdint.h> ,其中定义了typedef intmax_t 和 uintmax_t 等 . 这些分别指定"a (signed|unsigned) integer type capable of representing any value of any (signed|unsigned) integer type&q...
  • 18 votes
     answers
     views

    使用FFI时,C99 bool的等效Haskell类型是什么?

    我有一个使用C99 bool 数据类型的库,我想通过FFI调用它 . Haskell中C99 bool的对应类型是什么?在Foreign.C.types中有CInt,CShort等,但没有CBool . 如果 bool 没有"correct"类型,那么在期望 bool 的函数中传递的安全替代类型是什么? 另一种方法是修改C库,但我希望保持原样 .
  • 5 votes
     answers
     views

    何时在C中使用可变长度数组,但是在动态分配时?

    我在C99中找到了可变长度数组,但看起来它的行为与malloc free几乎相同 . 我找到的实际差异: 太大的数组处理: unsigned size = 4000000000; int* ptr = malloc(size); // ptr is 0, program doesn't crash int array[size]; // segmentation fault, program ...
  • 43 votes
     answers
     views

    Printf long long int in C with GCC?

    如何使用GCC在C99中printf long long int 和 unsigned long long int ? 我搜索了其他建议使用 %lld 的帖子,但是它给出了这些警告: 警告#1:格式为[-Wformat] |的未知转换类型字符'l'警告#2:格式参数太多[-Wformat-extra-args] | 对于以下尝试: #include <stdio.h> int ...
  • 101 votes
     answers
     views

    Visual Studio支持新的C / C标准?

    我一直在阅读关于C99和C 11以及所有这些非常甜蜜的东西,它们被添加到语言标准中,有朝一日可能会很好用 . 但是,我们目前在Visual Studio中编写C语言已经萎靡不振 . 标准中的任何新东西是否会被添加到visual studio中,或者微软是否更有兴趣添加新的C#变体来做到这一点? 编辑:除了接受的答案,我找到了Visual C团队博客: http://blogs.msdn.com/v...
  • 75 votes
     answers
     views

    C99中最有用的新功能是什么? [关闭]

    C99已经存在了超过10年,但对它的支持一直缓慢,所以大多数开发人员都坚持使用C89 . 即使在今天,当我遇到C代码中的C99功能时,我有时会感到有些惊讶 . 现在大多数主要编译器都支持C99(MSVC是一个值得注意的例外,而且一些嵌入式编译器也落后了),我觉得与C合作的开发人员可能应该知道他们可以使用哪些C99功能 . 一些功能只是之前从未标准化的常见功能(例如, snprintf ),或者熟悉...
  • 8 votes
     answers
     views

    强制编译器符合C99标准

    当我发现我已经使用了一段时间的匿名结构实际上只能在C11中使用,而不是C99时,我正在对我的项目进行编码,这是我想编写的标准 . 给出以下代码: struct data { int a; struct { int b; int c; }; }; int main() { struct data d; d.a = 0; ...
  • 5 votes
     answers
     views

    C89 / C90,C99和C11的兼容性

    我刚刚读到:C Wikipedia entry . 据我所知,有三种不同版本的C被广泛使用:C89,C99和C11 . 我的问题涉及不同版本的源代码的兼容性 . 假设我要编写一个程序(在C11中,因为它是最新版本)并导入一个用C89编写的库 . 根据C11规范编译所有文件时,这两个版本是否能够正常工作? Question 1 :C的较新版本是旧版C版本的C99,C11超集吗?我认为,超集我的意思是...
  • 55 votes
     answers
     views

    是否通过C99中未指定的联合进行类型惩罚,并且它是否在C11中指定?

    Stack Overflow问题Getting the IEEE Single-precision bits for a float的一些答案建议使用 union 结构进行类型惩罚(例如:将 float 的位转换为 uint32_t ): union { float f; uint32_t u; } un; un.f = your_float; uint32_t target = ...
  • 18 votes
     answers
     views

    使用void *键入punning而不破坏C99中的严格别名规则

    我最近遇到了严格的别名规则,但我无法理解如何使用 void * 来执行类型惩罚而不违反规则 . 我知道这违反了规则: int x = 0xDEADBEEF; short *y = (short *)&x; *y = 42; int z = x; 而且我知道我可以安全地使用C99中的联合进行类型惩罚: union{ int x; short y; } data; da...
  • 4 votes
     answers
     views

    C语言中的IEEE-754浮点异常

    我在C中编写一个浮点计算器接口,它允许在运行时访问math.h中定义的数学函数 . 该接口实现为一个行为类似于strtold()的函数 . 它基于ASCII,并且应该像ASCII一样可移植,但为了使其真实,我需要以尽可能便携的方式处理浮点 . 我很高兴限制对IEEE-754浮点的支持,但我不知道如何处理IEEE-754定义的异常(溢出,下溢等) . 首先,我非常确定检查在所有舍入模式下工作的异常的...
  • 4 votes
     answers
     views

    枚举是否是位域实现定义的类型?

    我正在努力更好地理解C99标准,但现在我对使用枚举作为结构中的位域并将它们视为int或实现定义类型感到困惑 . 在查看C99的最终草案时,我找到了6.7.2.1段 . 4 位字段的类型应为_Bool,signed int,unsigned int或其他实现定义类型的限定或非限定版本 . 和6.7.2.2段 . 4 每个枚举类型应与char,有符号整数类型或无符号整数类型兼容 . 类型的选...
  • 5 votes
     answers
     views

    C结构中的柔性阵列构件

    引自C-std部分6.7.2.1, struct s { int n; double d[]; }; 这是一个有效的结构声明 . 我正在寻找这种语法的一些实际用途 . 确切地说,这个构造如何比保持double *作为第二个元素更强或更弱?或者这是“你可以做多种方式”的另一种情况吗? Arpan
  • 1 votes
     answers
     views

    为什么两个.C文件中的同名私有函数会导致多重定义错误?

    我在赛普拉斯PSoC IDE(C99 ARM_GCC)中编码 . 当我在两个 *.c 模块中使用具有相同名称的函数时(例如 void MyClear() ),我得到错误: 构建错误:“清除”的多重定义 MyClear() 在任何 Headers 中都没有提到,我推测它是 .C 文件的私有,但我显然是错的 .
  • 88 votes
     answers
     views

    有机器,sizeof(char)!= 1,或者至少CHAR_BIT> 8?

    是否有机器(或编译器), sizeof(char) != 1 ? C99 standard 是否认为标准合规实施的 sizeof(char) 必须正好为1?如果有,请给我部分编号和引文 . 更新:如果我有一台机器(CPU),它不能解决字节(最小读取是4个字节,对齐),但只有4-s的字节( uint32_t ),这台机器的编译器可以将sizeof(char)定义为4 ? sizeof(char) ...
  • 81 votes
     answers
     views

    C99布尔数据类型?

    什么是C99布尔数据类型以及如何使用它?
  • 3 votes
     answers
     views

    const限定符被忽略[重复]

    这个问题在这里已有答案: typedef pointer const weirdness 6个答案 我有一个struct type_s . 然后我输入一个指向结构type_s的指针作为类型 . 如果我有 const struct type_s* 那么编译器将正确地抱怨如果对结构成员进行了赋值,如函数Test1()中所示 . 但是如果我创建一个const类型,它是同一结构指针的typedef,编...
  • 1 votes
     answers
     views

    C99代码在Linux上编译,Windows上的语法错误

    我在C99中有一个代码库,可以在Linux上使用GCC和Clang完美地编译和运行;但是,在MinGW-w64(通过MSYS2安装)上,它会出现错误 include/math3d.h: In function 'matPerspective': include/math3d.h:577:1: error: parameter name omitted matPerspective (float y...
  • 3 votes
     answers
     views

    可变长度阵列和柔性阵列成员之间有什么区别?

    我在ISO C99 committee draft中看到结构可能有一个不完整的数组,其大小未指定,称为Flexible Array Member . 另一方面,C99还具有可变长度数组,允许在编译时声明大小不恒定的数组 . 我认为FAM是一种特殊的VLA,但我看到两个SO用户声称不然 . 另外,阅读Wikipedia section on sizeof,它表示 sizeof 对于那两个表现不同 ....
  • 3 votes
     answers
     views

    union是否支持灵活的阵列成员?

    我在联合中声明了一个灵活的数组成员,如下所示: #include <stdio.h> union ut { int i; int a[]; // flexible array member }; int main(void) { union ut s; return 0; } 和编译器给出一个错误: source_file.c:8:9: erro...
  • 4 votes
     answers
     views

    柔性阵列成员上的结构

    我正在编写一个C程序(可编译),它必须处理许多不同的结构,所有结构都来自具有预定义格式的缓冲区 . 格式指定我应该加载哪种类型的结构 . 这可以使用联合解决,但结构大小的差异使我决定在其中具有void *的结构: struct msg { int type; void * data; /* may be any of the 50 defined structures: @see ...
  • 42 votes
     answers
     views

    struct中的匿名联合不在c99中?

    这里是我所遇到的非常简化的问题代码: enum node_type { t_int, t_double }; struct int_node { int value; }; struct double_node { double value; }; struct node { enum node_type type; union { s...
  • 3 votes
     answers
     views

    将单精度除法实现为双精度乘法

    问题 对于实现精确IEEE 754算法的C99编译器, f , divisor 类型 float 的值是否存在 f / divisor != (float)(f * (1.0 / divisor)) ? 编辑:通过“实现精确的IEEE 754算术”我的意思是一个正确定义FLT_EVAL_METHOD为0的编译器 . 上下文 提供符合IEEE 754标准的浮点的C编译器只能通过单次精度乘以逆来用常量...
  • 4 votes
     answers
     views

    从理论上讲,实现是否可以将unsigned int提升为int?

    根据C99标准的以下两个条款: 6.2.5-9有符号整数类型的非负值范围是相应无符号整数类型的子范围,每种类型中相同值的表示形式相同 . 6.2.6.2-2对于有符号整数类型,对象表示的位应分为三组:值位,填充位和符号位 . 不需要任何填充位;应该只有一个符号位 . 作为值位的每个位应具有与相应无符号类型的对象表示中的相同位相同的值(如果有符号类型中有M个值位且无符号类型中有N,则M≤N) ....
  • 3 votes
     answers
     views

    C99标准是否保证了unsigned int的二进制表示?

    C99(ISO / IEC 9899:1999) 6.2.6.2/1整数类型任何填充位的值都是未指定的.45)符号位为零的有符号整数类型的有效(非陷阱)对象表示是相应无符号类型的有效对象表示,并代表相同的 Value . 对于任何整数类型,所有位为零的对象表示应该是该类型中零值的表示 . 在C99标准中,保证所有位为零的整数类型表示相应类型中的值 0 . 但是,这是否保证了基础二进制值是我...
  • 1 votes
     answers
     views

    在signed int和unsigned int之间进行转换时是否需要类型转换?

    我尝试将signed int分配给unsigned int . #include <stdio.h> int main() { int a; unsigned int b; scanf("%d", &a); b = a; printf("%d %u\n", a, b); return 0; } 我希望编译它会导...
  • 18 votes
     answers
     views

    添加两个浮点数

    我想计算两个IEEE 754二进制64号的总和,四舍五入 . 为此我在下面写了C99程序: #include <stdio.h> #include <fenv.h> #pragma STDC FENV_ACCESS ON int main(int c, char *v[]){ fesetround(FE_UPWARD); printf("%a\n&quo...
  • 123 votes
     answers
     views

    当在C89模式下编译时,以下程序如何输出`C89`和在C99模式下编译时输出`C99`?

    我从网上找到了这个C程序: #include <stdio.h> int main(){ printf("C%d\n",(int)(90-(-4.5//**/ -4.5))); return 0; } 这个程序的有趣之处在于,当它在C89模式下编译和运行时,它会打印 C89 ,当它被编译并在C99模式下运行时,它会打印 C99 . ...
  • 6 votes
     answers
     views

    使用灵活的数组成员分配struct

    这是C99代码: typedef struct expr_t { int n_children; foo data; // Maybe whatever type with unknown alignment struct expr_t *children[]; } expr_t; 现在,我该如何分配内存? expr_t *e = malloc (sizeof (exp...
  • 1 votes
     answers
     views

    创建大小为零的灵活数组成员是否合法?

    C99标准允许创建灵活的阵列成员,例如 typedef struct pstring { size_t length; char string[]; } pstring; 然后用 pstring* s = malloc(sizeof(pstring) + len) 之类的东西初始化它 . 是否允许 len 为零?它似乎是一致的,并且不时会节省空间(当然可能不是用 pstring 示例...

热门问题