Tag: 标准

使用字符类型上次写入时,使用非字符类型读取对象时的未定义行为

假设unsigned int没有陷阱表示,请执行下面标记为(A)和(B)的语句中的任何一个或两个引发未定义的行为,为什么或为什么不行为,以及(特别是如果您认为其中一个定义明确但另一个不定义)是的,您认为标准中存在缺陷吗? 我主要对当前版本的C标准(即C2011)感兴趣,但如果在标准的旧版本或C ++中有所不同,我也想知道这一点。 ( _Alignas在这个程序中被用来消除因对齐不充分而导致的任何UB问题。我在解释中讨论的规则虽然没有说明对齐。) #include #include int main(void) { unsigned int v1, v2; unsigned char _Alignas(unsigned int) b1[sizeof(unsigned int)]; unsigned char *b2 = malloc(sizeof(unsigned int)); if (!b2) return 1; memset(b1, 0x55, sizeof(unsigned int)); memset(b2, 0x55, sizeof(unsigned int)); v1 = *(unsigned int *)b1; /* (A) */ v2 = *(unsigned int *)b2; /* (B) */ […]

符合ANSI C的实现是否可以在其标准库中包含其他function?

是否符合ANSI C标准的实现允许在其标准库中包含其他类型和function,除了标准列举的那些之外? (理想的答案将参考ANSI标准的相关部分。) 我特别要求,因为Mac OS 10.7在stdio.h中声明了getline函数,即使使用-ansi标志使用gcc或clang进行编译也是如此。 这打破了几个定义自己的getline函数的旧程序。 这是Mac OS 10.7的错吗? (Mac OS 10.7上getline的手册页说getline符合2008年推出的POSIX.1标准。) 编辑:为了澄清,我发现奇怪的是,在Mac OS 10.7上的ANSI C89程序中包含stdio.h也会getline函数的声明,因为getline不是K&R中枚举的函数之一(可能是ANSI) stdio.h的描述。 特别是,尝试编译noweb : gcc -ansi -pedantic -c -o notangle.o notangle.c In file included from notangle.nw:28: getline.h:4: error: conflicting types for ‘getline’ /usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here 它是否是Mac OS 10.7中的一个错误,即使在编译ANSI C89标准时也包含stdio.h中的getline声明?

为什么char的符号没有在C中定义?

C标准规定: ISO / IEC 9899:1999,6.2.5.15(第49页) char,signed char和unsigned char这三种类型统称为字符类型。 实现应将char定义为具有与signed char或unsigned char相同的范围,表示和行为。 确实gcc根据目标平台定义。 我的问题是,为什么标准会这样做? 除了可怕的和难以发现的错误之外,我看不到任何可能来自模糊类型定义的内容。 不仅如此,在ANSI C(C99之前)中,唯一的字节大小类型是char,因此使用char进行数学运算有时是不可避免的。 所以说“一个人永远不应该使用char来表示数学”并非如此。 如果是这种情况,更明智的决定是包括三种类型“ char , ubyte , sbyte ”。 有没有理由,或者它只是一些奇怪的向后兼容性问题,以便将坏(但常见)编译器定义为标准兼容?

是否允许编译器向标准头添加函数?

是否允许C编译器向标准头添加函数并仍然符合C标准? 我在某处读到了这个,但除了附件J.5外,我在标准中找不到任何参考: 包含可能导致严格符合程序无效的任何扩展会导致实现不一致。 此类扩展的示例包括新关键字, 标准标头中声明的额外库函数 ,或者名称不以下划线开头的预定义宏。 但是,附件J是提供信息的而不是规范性的…所以它没有帮助。 所以我想知道一个符合标准的编译器是否可以在标准头文件中添加额外的function? 例如,假设它将非标准itoa添加到stdlib.h中。

stdlib的rand()总是给出相同的序列吗?

我非常希望能够重复生成相同的伪随机数据集,特别是在调整实验代码时。 通过观察我会说rand()似乎每次都给出相同的数字序列*。 是否可以保证在同一台机器/不同机器/不同架构上重复执行? *明显对于同一种子。

解析数字时scanf()和strtol()/ strtod()之间的区别

注意:我完全重写了这个问题,以更恰当地反映出我为此设置的赏金。 请原谅与已经给出的答案有任何不一致之处。 我不想创建一个新问题,因为之前的答案可能会有所帮助。 我正在努力实现C标准库,并对标准的一个特定角落感到困惑。 该标准根据strtol , strtoul和strtod的定义定义了scanf函数系列接受的数字格式(%d,%i,%u,%o,%x)。 该标准还说fscanf()只会将最多一个字符放回输入流中,因此strtol , strtoul和strtod接受的某些序列对fscanf是不可接受的(ISO / IEC 9899:1999,脚注251)。 我试图找到一些会表现出这种差异的价值观。 事实certificate,hex前缀“0x”,后跟一个不是hex数字的字符,就是两个函数系列不同的情况。 有趣的是,很明显没有两个可用的C库似乎在输出上达成一致。 (请参阅本问题末尾的测试程序和示例输出。) 我想听到的是解析“0xz”时会被视为符合标准的行为? 。 理想情况下引用标准中的相关部分来说明问题。 #include #include #include int main() { int i, count, rc; unsigned u; char * endptr = NULL; char culprit[] = “0xz”; /* File I/O to assert fscanf == sscanf */ FILE * fh = fopen( […]

C89标准中的哪个部分允许“隐式整数”规则?

使用gcc ,代码: register a = 3; static b = 3; 虽然有警告,但在使用-std=c89 -pedantic-errors标志时允许使用它。 但是,它会收到-std=c99 -pedantic-errors标志-std=c99 -pedantic-errors 。 我想知道C89标准的哪一部分允许“隐含整数”规则?

为什么C标准不支持嵌套函数?

在assembly中实现它似乎不太难。 gcc还有一个标志(-fnested-functions)来启用它们。

使用fscanf()读取一行时遇到问题

我正在尝试使用以下代码读取一行: while(fscanf(f, “%[^\n\r]s”, cLine) != EOF ) { /* do something with cLine */ } 但不知怎的,我每次只得到第一行。 这是一条读线的坏方法吗? 我该怎么办才能让它按预期工作?

void,VOID,C和C ++

我有以下代码: typedef void VOID; int f(void); int g(VOID); 它在C中编译得很好(在Fedora 10上使用gcc 4.3.2)。 编译为C ++的相同代码给出了以下错误: void.c:3: error: ” has incomplete type void.c:3: error: invalid use of ‘VOID’ 现在,这是外部库中的东西,我希望所有者解决这个问题。 所以我有一个问题 – C ++标准是否禁止此构造? 你能给我一个指针/引文吗? 我唯一记得的是在C ++中不推荐用函数声明(void)来表示空参数列表,但我不明白为什么typedefed VOID不起作用。