Questions tagged «c89»

该标签用于有关国际标准ISO 9899:1990(也称为“ C89”,“ C90”或“ ANSI C”)的修订和技术更正(与K&R C,C99,C11或更高版本的C标准修订相反)的问题。 )。


8
将变量声明放置在C中
我一直以为在C语言中,所有变量都必须在函数开始时声明。我知道C99中的规则与C ++中的规则相同,但是C89 / ANSI C的变量声明放置规则是什么? 以下代码使用gcc -std=c89和成功编译gcc -ansi: #include <stdio.h> int main() { int i; for (i = 0; i < 10; i++) { char c = (i % 95) + 32; printf("%i: %c\n", i, c); char *s; s = "some string"; puts(s); } return 0; } 不应该的声明c,并s导致C89 / ANSI模式错误?
129 c  declaration  c89 

3
在C89模式下编译时,下面的程序如何输出C89?在C99模式下编译时,下面的程序如何输出?
我从网上找到了这个C程序: #include <stdio.h> int main(){ printf("C%d\n",(int)(90-(-4.5//**/ -4.5))); return 0; } 该程序的有趣之处在于,当它在C89模式下编译并运行时,它会打印,C89而当它在C99模式下编译并运行时,它会打印C99。但我无法弄清楚该程序如何工作。 您能否解释printf上述程序中第二个参数的工作方式?
128 c  printf  comments  c99  c89 

5
C,C99,ANSI C和GNU C有什么区别?
我已经开始在Codechef上进行编程实践,并且对C和C99之间的差异感到困惑。C在这里是什么意思?是C89吗?检查此提交底部的语言。它同时包含C和C99。 我在互联网上发现了一个名为GNU C的东西。Linux / unix系统是否有其他C?这些是否符合ANSI的C标准?我在某些地方也读过“ C99严格”。这是什么? 是否还有其他使用的C标准?是否有所谓的C 4.3.2或当前使用的gcc版本? 编辑: 这,这,这有所帮助。我将搜索更多并编辑未回答的内容。 我不是编程新手。我知道什么是C语言。我知道ANSI有不同的C标准,例如C89,C99和C11。
122 c  gcc  c99  c89  ansi-c 

8
“结构骇客”在技术上是不确定的行为吗?
我要问的是众所周知的“结构的最后一个成员具有可变长度”的技巧。它是这样的: struct T { int len; char s[1]; }; struct T *p = malloc(sizeof(struct T) + 100); p->len = 100; strcpy(p->s, "hello world"); 由于结构在内存中的布局方式,我们能够将结构覆盖在大于必要的块上,并将最后一个成员视为大于1 char指定的成员。 所以问题是:这项技术在技术上是否是未定义的行为?。我希望是这样,但是很好奇标准对此表示了什么。 PS:我知道使用C99的方法,我希望答案特别遵循上面列出的技巧。

3
在哪里可以找到PDF格式的C89 / C90标准?
我正在寻找C89 / C90标准的免费副本版本,但在任何地方都找不到!为什么很难找到它? C99和C11标准很容易在Internet上获得。即使在Stack Overflow问题中,在哪里也可以找到最新的C或C ++标准文档?和C标准,获取标准不包含我要查找的内容。 网络搜索也没有帮助,开放标准也没有帮助。
87 c  ansi  c89 

10
为什么要使用strncpy而不是strcpy?
编辑:我已经为示例添加了源。 我遇到了这个例子: char source[MAX] = "123456789"; char source1[MAX] = "123456789"; char destination[MAX] = "abcdefg"; char destination1[MAX] = "abcdefg"; char *return_string; int index = 5; /* This is how strcpy works */ printf("destination is originally = '%s'\n", destination); return_string = strcpy(destination, source); printf("after strcpy, dest becomes '%s'\n\n", destination); /* This is …

30
是否有任何理由使用C而不是C ++进行嵌入式开发?
题 我的硬件C ++和C89上有两个编译器 我正在考虑将C ++与类一起使用,但不要使用多态性(以避免使用vtables)。我想使用C ++的主要原因是: 我更喜欢使用“内联”函数而不是宏定义。 我想使用名称空间作为前缀,使代码混乱。 我认为C ++的类型更安全,主要是因为模板和冗长的强制转换。 我真的很喜欢重载的函数和构造函数(用于自动转换)。 在为非常有限的硬件(4kb RAM)开发时,您是否看到任何理由坚持使用C89? 结论 感谢您的回答,它们确实很有帮助! 我考虑了这个问题,因此我坚持使用C,主要是因为: 在C语言中预测实际代码会更容易,如果只有4kb的ram,这非常重要。 我的团队主要由C开发人员组成,因此高级C ++功能将不会经常使用。 我找到了一种在C编译器(C89)中内联函数的方法。 您提供了很多好的答案,很难接受一个答案。不幸的是,我无法创建维基并接受它,因此我将选择一个让我思考最多的答案。
81 c++  c  embedded  c89 

4
是否定义了减去两个NULL指针的行为?
如果两个非空指针变量都被赋值,是否定义了两个非空指针变量(根据C99和/或C ++ 98)的区别NULL? 例如,假设我有一个看起来像这样的缓冲区结构: struct buf { char *buf; char *pwrite; char *pread; } ex; 说,ex.buf指向数组或某些已分配的内存。如果我的代码始终确保pwrite并pread指向该数组或指向该数组的一个数组,那么我很有信心ex.pwrite - ex.pread将始终对其进行定义。但是,如果pwrite和pread都为NULL。我是否可以期望将两者定义相减,(ptrdiff_t)0还是严格遵从的代码需要测试指针是否为NULL?请注意,我唯一感兴趣的情况是两个指针均为NULL(表示缓冲区未初始化的情况)。在满足上述假设的前提下,原因与完全兼容的“可用”功能有关: size_t buf_avail(const struct s_buf *b) { return b->pwrite - b->pread; }
78 c++  c  c99  c89 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.