【问题标题】:Short-hands and Shortcuts of C/C++C/C++的捷径和捷径
【发布时间】:2012-01-16 07:40:05
【问题描述】:

是否有任何资源可以描述 C 和 C++ 必须提供的许多速记方法?那里有很多“狂野”的代码与教科书中的内容并不完全吻合。例如,许多教科书教你将变量的声明和初始化分开,但我看到相反的情况总是发生。

所以这是我目前的难题:C 是否允许没有类型标识符的程序?同样,教科书告诉我,如果没有指明其他类型,我至少应该给你一个 void 类型。但是,我看到了以下内容:

procedure(){
//procedure stuff
}

否则我一直被教导你至少必须这样做

void procedure(){
//procedure stuff
}

我发现自己经常处于这个位置,我认为这是没有接触过 C 或 C++ 项目/团队相关工作的症状。我很难确定“可编译代码”,因为许多书籍都教授了一种特定的方法,但在实践中完成相同任务的方法不止一种。谢谢。

【问题讨论】:

  • K&R C (pre-ANSI) 有隐式 int 函数。这意味着如果未指定返回类型,则假定为 int。
  • 您的示例代码不等效。隐含的返回类型是int 而不是void。甚至这仅在 ANSI C 之前。但是你问错了问题。您无法了解所有可能的捷径成语或其他任何东西。这些会随着时间而变化(甚至是核心语言),只有识别未知事物并寻找答案的能力才是重要的。
  • “很多教科书都教你将变量的声明和初始化分开” 如果 C++ 教科书是这样教的,那他们就完全错了。如果 C 教科书正在教这个,那么它们可能已经过时了。 C89 要求在块的顶部声明所有变量,因此通常无法在声明点初始化它们。 C99 修复了这个问题,因此通常适用与 C++ 相同的规则。
  • 请注意,那里有 很多 糟糕的 C 和 C++ 书籍,然后还有很多 书籍只是没有更新以跟上语言的发展。仅仅因为您在教科书中阅读了某些内容并不能使其成为良好的练习(不再)。其中很多不是速记“技巧”,而是不断发展的最佳实践。如果您无法获得更好的书,则观看 Stack Overflow 问题的答案是学习它们的好方法。 :-)

标签: c shorthand


【解决方案1】:

在函数定义中省略返回类型会使函数在 C89 中隐式返回 int。从 C99 开始,这不再被接受,并且实现可能拒绝翻译具有省略返回类型的函数定义的程序。

来自 C99 基本原理文档:

在 C89 中,可以从声明中的声明说明符中省略所有类型说明符。在这种情况下, int 是隐含的。委员会认为此功能的固有危险大于其便利性,因此将其删除。

【讨论】:

    【解决方案2】:

    如果没有明确的返回类型,则假定为int。由于遗留原因,它在那里。

    另一个遗留兼容性问题是您也可以省略参数类型:

    add(a, b) { // a and b implicitly int
        return a + b;
    }
    

    或者你可以声明参数的类型...不同的...

    strlen2(s)
    const char *s;
    {
        int l = 0;
        while(*s++) l++;
        return l;
    }
    

    不过,很明显,我不会在新代码中利用这些功能中的任何一个。

    【讨论】:

      【解决方案3】:

      我认为您指的是参数。在这种情况下,如果没有传递参数,最好使用 void,但它不是必需的,尽管它有未知数量的参数

      【讨论】:

        猜你喜欢
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        • 2015-05-12
        • 2016-03-08
        • 1970-01-01
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多