关闭。这个问题是opinion-based .它目前不接受答案。
想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.
去年关闭。
Improve this question
我是一门类(class)的助教,我不得不用 C 语言进行速成类(class),我的一个学生问,为什么我们仍然使用 -ansi
作为我们编译命令的一部分,因为它已经很旧了。
现在,当我在 10 多年前学习 C 时,有人告诉我这是因为它是最广泛采用和使用的 C 标准,而且开发人员实际上并没有从 ANSI/C89 转移。
我在讲座之前看过它,我能找到的所有使用方面的提及都是 2007 年或更早。
但我也找不到任何更新的建议。
我查看了 GitHub 上的 50 多个开源 C 项目,所有这些项目也在其 Make/CMAKE/WAF 配置中使用了 ANSI,所以我认为这仍然是常见的做法。
但是是吗?
我可以看到 ANSI(组织)官员在 C18。那么教学生这个更合适还是我们应该坚持使用C89?
我找不到任何关于当今常见做法的文档或描述,而且我主要在使用 89 或 90 的“遗留”系统中工作。
最佳答案
So would it be more appropriate to teach the students this or should we stick with C89?
可惜这个问题无法客观回答,所以会有点自以为是。
如果我是老师,我会使用现代 C,即 C11 或更新版本。但我也会经常展示过去如何做的例子。许多更改旨在改善编程习惯。
但是,在较新的 C(在 C11 中成为非强制性)中,我建议作为教师反对的一件事是 VLA:s。您可以在此处阅读我的回答以了解原因:Why VLA:s are bad请注意,这是人们不同意的事情。我不是说我是对的。 VLA:s 有他们的优点,但肯定也有他们的缺点。如果您想教授 VLA:s,那么教您何时以及如何不使用它们也很重要。
如果你想使用旧版本,那么至少坚持使用C99。从 C89 到 C99 的改进真的很重要。在大多数情况下,改进主要是关于可读性的便利,但这不应被低估。
Example1,循环变量:(恕我直言,对于良好的代码结构非常重要)
/* C89 */
int i;
for(i=0; i<10; i++) {
// C99
for(int i=0; i<10; i++) {
这不仅更加方便和可读。它还使循环变量在到达循环末尾时消失,保持本地状态。
Example2,评论:
/* C89 comment */
// C99 comment, and is not valid in C89
Example3,初始化器:
struct myStruct {
uint8_t a;
char b;
char *s;
};
struct myStruct createStructC89(uint8_t a, char b, char *s)
{
struct myStruct x;
x.a = a;
x.b = b;
x.s = s;
return x;
}
struct myStruct createStructC99(uint8_t a, char b, char *s)
{
struct myStruct x = {a, b, s};
return x;
}
该决定也可能取决于 C 类(class)的目标。
如果它的目标是成为一名 C 程序员,那么我会说指出差异很重要,因为大多数专业的 C 程序员将不得不处理遗留问题。
另一方面,考虑一下 C 只是被选为一种语言来教初学者编程的情况,或者该类(class)是否旨在接近硬件,例如计算机体系结构类(class)。那么我肯定会选择 C11 或 C18。我会考虑要求所有的handins 用
gcc -Wall -Wextra -Werror -Werror=vla -pedantic -std=c11
编译-Wall -Wextra
启用额外警告 -Werror
将警告视为错误。典型的学校任务应该没有警告。 -Werror=vla
不允许 vla pedantic
禁用许多扩展并强制程序(大部分)符合指定的标准 -std=c11
使用 C11。如果需要,更改为 C99 或 C18。 关于c - 我应该教 C89、C18 还是别的什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60163728/