【问题标题】:What weird C syntax is this? [duplicate]这是什么奇怪的 C 语法? [复制]
【发布时间】:2011-05-21 19:17:43
【问题描述】:

可能的重复:
C variable declarations after function heading in definition
What is useful about this C syntax?

我试图理解一些 C 代码并遇到了在函数头部和第一个大括号之间声明变量的地方。

知道这些变量是什么吗?
它们是本地的还是全球的?

作者打算在这里做什么?

void someFunction (m_ptr, n_ptr, params, err)
            integer  *m_ptr;        /* pointer to number of points to fit */
            integer  *n_ptr;        /* pointer to number of parameters */
            doublereal *params;     /* vector of parameters */
            doublereal *err;        /* vector of error from data */
        {
            //some variables declared here
            int       i;
            ...
            ...

            //body of the function here

        }

【问题讨论】:

标签: c syntax


【解决方案1】:

这是一个 K&R 风格的声明,这就是 30 年前 C 的编写方式(它仍然受支持,但在 C99 中已弃用;我相信它将在 C1x 中删除)。从类型上看,代码很可能是从 Fortran 转换而来的,所以谁知道原始代码的使用时间。

这并不是严格的原创K&R,不过因为void的存在。

在“现代”C 中,它看起来像:

void someFunction (integer *m_ptr, integer *n_ptr,
                   doublereal *params, doublereal *err)
{
    //some variables declared here
    int       i;
    ...
    ...

    //body of the function here
}

【讨论】:

  • 主题历史+1!
【解决方案2】:

它们是函数参数。这是声明它们的另一种方法。它们的工作方式与普通参数相同。

有关较长但内容丰富的解释,请参阅Alternative (K&R) C syntax for function declaration versus prototypes

【讨论】:

  • 在最新版本的标准中它们已被弃用(或完全删除?我忘了..)。
  • 可能。我试图用谷歌搜索它,以便将其包含在此答案中,但找不到它们。
  • "doublereal" 怎么样,在 C# 中该类型是否有任何等价物,或者我现在可以只使用 double 吗?
  • @Kevin Boyd:doublereal 几乎可以肯定只是double 的类型定义。这是一种 Fortran 主义,您经常在从 Fortran 转换的 C 代码中看到它。 integer 同上。
【解决方案3】:

这些变量是参数的声明。不知道为什么有人再使用这种风格。不过这些类型必须是 typedef 的。

如果这是旧的遗留代码,那么 void 真的作为关键字存在吗?

【讨论】:

  • 这就解释了。我对 void 关键字有点困惑,但似乎旧的编译器也支持它。
猜你喜欢
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 2011-03-02
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多