c - 我应该教 C89、C18 还是别的什么?

标签 c

关闭。这个问题是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/

    相关文章:

    c - 在 float 的右侧添加零

    c++ - 如何重构这个 C++ 以删除标签/goto?

    c - C 中的虚函数

    c - 进程的虚拟地址空间的哪些部分是可覆盖的?

    c++ - 异步事件循环设计和问题

    c - 在 C 中的 "__' 行和 '___' 列之后停止数组?

    c++ - 无需 nm 或其他外部工具即可查找全局变量

    C 先读再写

    c++ - 为什么 strtoul 不能按预期工作?

    c - 尽管释放结构内存泄漏