Tag: c89

ANSI C和K&R C之间的主要区别是什么?

维基百科关于ANSI C的文章说: ANSI C标准化过程的目的之一是生成K&R C(第一个公布的标准)的超集,其中包含许多后来引入的非官方特征。 然而,标准委员会还包括了一些新的特性,比如函数原型(借用C ++编程语言)和更强大的预处理器。 参数声明的语法也被改变,以反映C ++风格。 这让我觉得有分歧。 但是,我没有看到K&R C和ANSI C之间的比较。有没有这样的文件? 如果不是,主要区别是什么? 编辑:我相信K&R书在封面上说“ANSI C”。 至less我相信我在家有这个版本。 所以也许这没有什么区别了?

为什么在C99之前混合了声明和代码?

我最近成为一个主要教授C的大学课程的助教。C90课程标准化,主要是由于广泛的编译器支持。 对于以前的Java经验的C新手来说,一个非常混乱的概念是variables声明和代码不能混在一个块(复合语句)中的规则。 C99终于解除了这个限制,但我想知道:有人知道为什么它在那里吗? 它是否简化了variables范围分析? 它是否允许程序员指定在哪些程序执行点上堆栈应该为新variables增长? 我认为语言devise者如果完全没有任何目的,就不会增加这样的限制。

我在哪里可以findPDF格式的C89 / C90标准?

我正在寻找C89 / C90标准的免费版本,但我找不到任何地方! 为什么很难find它? C99和C11标准很容易在互联网上获得副本。 即使在堆栈溢出问题我在哪里可以find当前的C或C ++标准文档? 而在C标准中,获得标准不包含我在找的东西。 networkingsearch也没有帮助,也没有开放标准 。

有没有任何理由使用C而不是C ++进行embedded式开发?

题 我的硬件C ++和C89上有两个编译器 我正在考虑使用C ++的类,但没有多态(避免vtable)。 我想使用C ++的主要原因是: 我更喜欢使用“内联”函数而不是macros定义。 我想使用命名空间,因为我前缀杂乱的代码。 我看到C ++有点types更安全,主要是因为模板和详细的转换。 我真的很喜欢重载的函数和构造函数(用于自动投射)。 在开发非常有限的硬件(RAM的4kb)时,您是否看到有任何理由坚持使用C89? 结论 谢谢你的回答,他们真的很有帮助! 我认为这个主题通过,我会坚持与C主要是因为: 在C中预测实际的代码比较容易,如果你只有4kb的内存,这是非常重要的。 我的团队主要由C开发人员组成,所以先进的C ++function不会经常使用。 我find了一种在C编译器(C89)中内联函数的方法。 你提供了这么多好的答案,很难接受一个答案。 不幸的是,我不能创build一个wiki并接受它,所以我会select一个让我最想得到的答案。

减去两个NULL指针的行为是否定义?

是否定义了两个非空指针variables(每个C99和/或C ++ 98)的差异,如果它们都是NULL值? 例如,说我有一个缓冲区结构,看起来像这样: struct buf { char *buf; char *pwrite; char *pread; } ex; 说, ex.buf指向一个数组或一些malloc'ed内存。 如果我的代码总是确保pwrite和pread指向那个数组或者是一个超过它,那么我相信ex.pwrite – ex.pread将总是被定义的。 但是,如果pwrite和pread都是NULL, 我可以只是期望减去两个被定义为(ptrdiff_t)0或严格符合的代码是否需要testing指针NULL? 请注意,我感兴趣的唯一情况是当两个指针都是NULL(这代表一个缓冲区未初始化的情况下)。 考虑到前面的假设得到满足,原因与完全符合“可用”函数有关: size_t buf_avail(const struct s_buf *b) { return b->pwrite – b->pread; }

C中的variables声明放置

我一直认为在C语言中,所有variables都必须在函数的开头声明。 我知道在C99中,规则与C ++中的规则相同,但C89 / ANSI C的variables声明放置规则是什么? 下面的代码用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模式下导致错误?

下面的程序如何在C89模式下编译时输出“C89”,编译为C99模式时如何输出“C99”?

我从网上find了这个C程序: #include <stdio.h> int main(){ printf("C%d\n",(int)(90-(-4.5//**/ -4.5))); return 0; } 这个程序的有趣之处在于,它在C89模式下编译和运行时,会打印C89 ,当它编译并运行在C99模式下时,将打印C99 。 但我无法弄清楚这个程序是如何工作的。 你能解释一下printf的第二个参数在上面的程序中是如何工作的吗?

在MS Visual C ++中启用VLAs(可变长度数组)?

我怎样才能使用在Visual C ++中定义的VLA,可变长度的数组,如C99,或者根本不可能? 是的,我知道C ++标准是基于C89的,并且在C89标准中没有可用的VLA,因此在C ++中是不可用的,但MSVC ++也应该是C编译器,也可以使用/ TC编译参数( Compile as C Code (/TC) )。 但是这样做似乎并没有启用VLA,编译过程在编译为C ++( Compile as C++ Code (/TP) )时也会出现相同的错误。 也许MSVC ++ C编译器只是C89兼容或我缺less的东西(一些特殊的结构或编译/定义)? 代码示例: #include <stdlib.h> int main(int argc, char **argv) { char pc[argc+5]; /* do something useful with pc */ return EXIT_SUCCESS; } 编译错误: 错误C2057:预期的常量expression式 错误C2466:不能分配一个常量大小为0的数组 错误C2133:'pc':未知的大小

C,C99,ANSI C和GNU C有什么区别?

我已经开始对codechef进行编程练习, 并被 C和C99之间的差异弄糊涂了。 C是什么意思? 是C89吗? 检查提交底部的语言。 它包含C和C99。 我在网上find一些叫做GNU C的东西。对于linux / unix系统有没有不同的C语言? 这些标准是否符合ANSI的C标准? 我也在一些地方读过“C99严格”。 这是什么? 还有其他的C标准吗? 有没有什么叫做C 4.3.2,还是现在使用的gcc版本? 编辑: 这 , 这个 ,帮助。 我会search更多,并编辑没有答案的东西。 我不是一个编程新手。 我知道C语言是什么。 我知道ANSI有不同的C标准,如C89,C99和C11。

使用M_PI与C89标准

我使用C并尝试访问常量M_PI(3.14159 …)。 我已经导入了math.h头文件,但M_PI常量仍未定义。 通过一些searchStackOverflow我发现我需要添加#define _USE_MATH_DEFINES到我的代码(请参阅下面的示例代码)。 这在正常编译时工作正常,但我需要能够用std=c89标志来编译我正在做的工作。 我应该如何从一些C89代码访问M_PI?