Tag: 标准

C和C ++编码标准

关于C和C ++编码标准的最佳实践是什么? 是否应允许开发人员将它们混合在一起。 链接C和C ++目标文件时是否存在任何复杂情况。 传统上用C语言编写的套接字库是否应保留在C中并保存在单独的源文件中? 这是将.c文件和c ++代码中的c代码保存在.cpp文件中。 在使用g ++解析后混合c和C ++会有任何性能损失,因为类型安全检查不是在C中完成的吗? 但是在C ++中。 将是链接C和C ++源代码文件的最佳方式。

将float + INF,-INF和NAN转换为C中的整数的结果是什么?

是否有任何标准规定了输出应该是什么? 例如这段代码: #include #include int main(int argc, char** argv) { float a = INFINITY; float b = -INFINITY; float c = NAN; printf(“float %f %f %f\n”, a, b, c); printf(“int %d %d %d\n”, (int) a, (int) b, (int) c); printf(“uint %u %u %u\n”, (unsigned int) a, (unsigned int) b, (unsigned int) c); printf(“lint %ld %ld […]

变量的前后增量运算在TC和gcc上给出不同的输出

这是我的简单代码…… #include int main() { int i=5; printf(“%d %d %d %d %d “,i++,i–,++i,–i,i); return 0; } 在gcc上,它输出为“4 5 5 5 5” 但在TC上,它输出为’4 5 5 4 5′ 我知道在printf语句中,如果是单个表达式,则评估将从左到右,但在正常语句中,它将从左到右。 但是如果printf包含多个表达式,那么评估将在堆栈上,元素将从左到右推入堆栈,但从右到左弹出,这certificateTC输出是正确的 请纠正我在哪里错了???

我可以使用标准库在C中寻找超过2GB的位置吗?

我正在制作一个用C语言读取磁盘映像的程序。我正在尝试制作可移植的东西,所以我不想使用太多特定于操作系统的库。 我知道有很多磁盘映像是非常大的文件,但我不确定如何支持这些文件。 我已经阅读了fseek ,它似乎使用了一个long int ,它不能保证支持超过2 31 -1的值。 fsetpos似乎使用fpos_t支持更大的值,但无法指定绝对位置。 我也有关于使用fseek几个相对寻求,但我不确定这是否便携。 如何在C中支持可移植地支持大文件?

在标准C中声明固定大小的整数typedef

是否有一种可靠的方法来为ISO标准C中的固定8,16,32和64位长度的整数类型声明typedef? 当我说ISO标准C时,我的意思是: ISO C89 / C90,而不是C99。 没有在ISO标准中定义的标头。 没有ISO标准中未定义的预处理器符号。 ISO标准中未指定类型大小的假设。 没有专有供应商符号。 我在StackOverflow中看到了与此类似的其他问题,但没有答案尚未违反上述约束之一。 我不确定没有诉诸平台符号是可能的。

“char(* a)”是什么意思?

这是C标准吗?

strcmp()和signed / unsigned字符

我对strcmp()感到困惑,或者更确切地说,它是如何由标准定义的。 考虑比较两个字符串,其中一个字符串包含ASCII-7范围之外的字符(0-127)。 C标准定义: int strcmp(const char * s1,const char * s2); strcmp函数将s1指向的字符串与s2指向的字符串进行比较。 strcmp函数返回一个大于,等于或小于零的整数,因为s1指向的字符串大于,等于或小于s2指向的字符串。 参数是char * 。 不是unsigned char * 。 没有任何概念“比较应该是unsigned ”。 但是我检查过的所有标准库都认为“高”字符就是那个,它的值高于ASCII-7字符。 我理解这是有用的和预期的行为。 我不想说现有的实现是错误的。 我只是想知道, 我错过了标准规格中的哪一部分 ? int strcmp_default( const char * s1, const char * s2 ) { while ( ( *s1 ) && ( *s1 == *s2 ) ) { ++s1; ++s2; […]

与stdbool.h C ++接口

在一个项目中,我在C ++和一个使用stdbool.h的C库之间进行接口。 #ifndef _STDBOOL_H #define _STDBOOL_H /* C99 Boolean types for compilers without C99 support */ /* http://www.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html */ #if !defined(__cplusplus) #if !defined(__GNUC__) /* _Bool builtin type is included in GCC */ typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool; #endif #define bool _Bool #define true 1 #define false […]

将非`void`指针转换为`uintptr_t`,反之亦然

有两个相关的C标准规则: C99标准, 6.3.2.3 : 指向void的指针可以转换为指向任何不完整或对象类型的指针。 指向任何不完整或对象类型的指针可能会转换为指向void的指针并再次返回; 结果应该等于原始指针。 并且7.20.1.4 : 下面的类型指定一个无符号整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void的指针,结果将与原始指针进行比较: uintptr_t 这意味着,以下代码符合: int *p = NULL; void *q = (void*)p; uintptr_t s = (uintptr_t)q; 但它真的需要两步演员吗? 如果执行以下操作,编译器是否会执行隐式中间转换: int *p = NULL; uintptr_t s = (uintptr_t)p; (好吧,它可能会出现在大多数编译器上,但我的问题是标准符合性)

“container_of”宏可以严格遵守吗?

linux内核(和其他地方)中常用的宏是container_of ,它(基本上)定义如下: #define container_of(ptr, type, member) (((type) *)((char *)(ptr) – offsetof((type), (member)))) 这基本上允许恢复“父”结构给定指向其中一个成员的指针: struct foo { char ch; int bar; }; … struct foo f = … int *ptr = &f.bar; // ‘ptr’ points to the ‘bar’ member of ‘struct foo’ inside ‘f’ struct foo *g = container_of(ptr, struct foo, bar); // now, ‘g’ should […]