Tag: 标准

为什么`putchar()`,`fputc()`和`putc()`的参数类型不是`char`?

有谁知道为什么putchar() , fputc()和putc()参数类型不是char ,但putwchar() , fputwc()和putwc()参数类型是wchar_t ? 另见这个和这个 。

不在C标准中包含strdup的理由是什么?

大多数C程序员都熟悉strdup函数。 他们中的许多人会认为这是理所当然的,但它不是C标准的一部分(C89,C99和C11都不是)。 它是POSIX的一部分,可能并非在所有环境中都可用。 事实上,微软坚持将其重命名为_strdup ,这增加了混乱。 以这种方式定义它是相当容易的(在C中): #include char *strdup(const char *s) { size_t size = strlen(s) + 1; char *p = malloc(size); if (p) { memcpy(p, s, size); } return p; } 但即使是精明的程序员也很容易弄错。 此外,仅在没有它的系统上重新定义函数certificate有点复杂,如下所述: strdup()函数 为什么不在C标准的修订版中包含这些有用的广泛支持的function? 在C99的C标准库中添加了许多新function,不包括strdup的理由是什么?

在stdint.h中定义的C99签名整数类型是否在溢出的情况下表现出良好定义的行为?

对于C(short,int,long等)中的“标准”有符号整数类型的所有操作,如果它们产生超出[TYPE_MIN,TYPE_MAX]间隔的结果(其中TYPE_MIN,TYPE_MAX是最小值和最大整数值),则表现出未定义的行为可以通过特定整数类型存储的。 但是,根据C99标准,所有intN_t类型都需要具有二进制补码表示: 7.8.11.1精确宽度整数类型 1. typedef名称intN_t指定有符号整数类型,其宽度为N,没有填充位和二进制补码表示。 因此,int8_t表示宽度恰好为8位的有符号整数类型。 这是否意味着C99中的intN_t类型在整数溢出的情况下表现出良好定义的行为? 例如,这段代码定义明确吗? #include #include #include int main(void) { printf(“Minimum 32-bit representable number: %” PRId32 “\n”, INT32_MAX + 1); return 0; }

使用ssize_t vs int

码 我有一个函数,我可以用以下四种方式之一编写: int do_or_die(int retval); int do_or_die(ssize_t retval); ssize_t do_or_die(int t retval); ssize_t do_or_die(ssize_t retval); 然后,它将使用这两种方式调用库函数: written = do_or_die(write(…)); // POSIX write returns ssize_t printed = do_or_die(printf(…)); // printf returns int 问题 我应该使用哪种原型? 我应该给written和printed什么类型? 我想拥有最强大和标准的代码,同时仍然只有一个do_or_die函数。 我在这种情况下使用C99,但如果C11的答案不同,那么我也想知道这一点,以备将来使用。

标准C中的约束是什么?

C标准谈论约束 ,例如ISO / IEC 9899:201x定义术语 约束 限制,无论是句法还是语义,通过它来解释语言元素的阐述 并在章节一致性中说 如果违反约束或运行时约束之外的”shall”或”shall not”要求,则行为未定义。 据说环境 ,分段诊断这一章 如果预处理转换单元或转换单元包含违反任何语法规则或约束的情况,则符合的实现应生成至少一个诊断消息(以实现定义的方式标识),即使该行为也明确指定为未定义或实现 – 定义。 因此,重要的是要知道C中的约束是什么,例如,编译器编写者判断何时需要诊断,或者C编程人员可以预期诊断而不仅仅是未定义的行为。 现在,标准文档中有一些标题为Constraints的部分 ,但是我找不到关于标准中术语约束究竟是什么的明确措辞。 约束是否出现在标题为约束的部分中? 在这些部分之外陈述的每项要求都不是约束条件吗? 我错过了标准中的约束的全面描述吗?

在C1X中初始化匿名结构或联合

我有以下问题:根据当前的C1X草案,匿名结构(或联合)如何正确初始化? 这是合法的: struct foo { int a; struct { int i; int j; }; int b; }; struct foo f = { 1, 2, 3, 4 }; struct foo g = { 1, { 2 }, 3 }; 在GCC中, gj == 0和gb == 3 ,而在tcc gj == 3和gb == 0 。 目前的草案说: “[…]结构和联合类型的对象的未命名成员不参与初始化。结构对象的未命名成员即使在初始化之后也具有不确定的值。” 这真的可以吗? 是不是 […]

为什么在兰特使用1103515245?

我正在谈论C标准中这种令人惊讶的简单rand()实现: static unsigned long int next = 1; int rand(void) /* RAND_MAX assumed to be 32767. */ { next = next * 1103515245 + 12345; return (unsigned)(next/65536) % 32768; } 从这篇维基百科文章我们知道乘数a (在上面的代码a = 1103515245 )应该只满足2个条件: a – 1可被m所有素因子整除。 (在我们的例子中, m = 2^32 ,int的大小,所以m只有一个素因子= 2) 如果m是4的倍数,则a – 1是4的倍数。 (32768是4的倍数,也是1103515244) 为什么他们选择了这样一个奇怪的,难以记住的,“男人,我厌倦了这些随机数字,写下任何”数字,如1103515245? 也许有一些明智的理由,这个数字在某种程度上比另一个更好? 例如,为什么不设置a = 20000000001 ? 它更大,更酷,更容易记住。

‘全球’和’静态全球’之间的区别

全局变量的范围在所有文件中,而静态全局变量的范围只是声明它的文件。 为什么这样? 全局或静态全局变量存储在内存中的哪个位置?

为什么C字符串文字的最大长度与max char 不同?

澄清 :鉴于字符串文字可以重写为const char[] (见下文),在文字上施加比char[]更低的最大长度只是语法上的不便。 为什么C标准鼓励这个? C89标准对字符串文字有翻译限制: 字符串文字或宽字符串文字中的509个字符(连接后) char数组没有限制; 也许 对象中的32767个字节(仅限托管环境中) 适用(我不确定什么对象或托管环境的意思),但无论如何它是一个更高的限制。 我的理解是字符串文字等同于包含字符的char数组,即:它总是可以重写这样的东西: const char* str = “foo”; 进入这个 static const char __THE_LITERAL[] = { ‘f’, ‘o’, ‘o’, ‘\0’ }; const char* str = __THE_LITERAL; 那么为什么文字如此严格限制呢?

为什么在g ++中std :: intmax_t不是__int128_t?

我的问题很简单:因为std::intmax_t被定义为根据cppreference的maximum width integer type ,为什么它不对应于GCC中的__int128_t ?