7

我是一门课程的助教,我不得不在 C 语言中进行速成课程,我的一个学生问,为什么我们仍然使用-ansi它作为编译命令的一部分,因为它已经很老了。

现在,当我在 10 多年前学习 C 时,我被告知这是因为它是最广泛采用和使用的 C 标准,而开发人员真的没有从 ANSI/C89 继续前进。我在讲座之前看过它,我能找到的所有提到的用法都是 2007 年或更早的。但我也找不到任何更新的建议。我浏览了 GitHub 上的 50 多个开源 C 项目,它们都在 Make/CMAKE/WAF 配置中使用了 ANSI,所以我认为这仍然是常见的做法。 但是是吗?

我可以看到 ANSI(组织)官员在 C18。那么教学生这个更合适还是我们应该坚持使用C89?我无法找到任何关于当今常见做法的文档或描述,而且我主要在使用 89 或 90 的“遗留”系统中工作。

4

1 回答 1

3

那么教学生这个更合适还是我们应该坚持使用C89?

不幸的是,这个问题无法客观地回答,所以会有点自以为是。

如果我是老师,我会使用现代 C,即 C11 或更高版本。但我也会经常展示过去如何完成的示例。许多更改旨在改善编程习惯。

但是,作为教师,我建议反对的较新 C 语言(在 C11 中已成为非强制性)中的一件事是 VLA:s。您可以在此处阅读我的答案以了解原因:为什么 VLA:s 不好请注意,这是人们不同意的事情。我没有声称我是正确的。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++) {

这不仅更方便和可读。它还使循环变量在到达循环结束时消失,使其保持本地化。

示例2,评论:

/* 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 课程的目标。

如果它的目标是成为一名 C 程序员,那么我想说指出差异很重要,因为大多数专业的 C 程序员将不得不处理遗留问题。

另一方面,考虑一下仅选择 C ​​作为一种语言来教授初学者编程的情况,或者如果课程旨在接近硬件,例如计算机体系结构课程。那我肯定会选择C11或C18。我会考虑要求所有handins编译gcc -Wall -Wextra -Werror -Werror=vla -pedantic -std=c11

  • -Wall -Wextra启用额外警告
  • -Werror将警告视为错误。典型的学校任务应该没有警告。
  • -Werror=vla不允许 vla
  • pedantic禁用许多扩展并强制程序(大部分)符合指定的标准
  • -std=c11使用 C11。如果需要,更改为 C99 或 C18。
于 2020-02-11T09:23:00.560 回答