【问题标题】:Function declarators in CC中的函数声明器
【发布时间】:2013-09-19 12:30:44
【问题描述】:

§6.7.6.3 函数声明符

2) 唯一应出现在参数声明中的存储类说明符是寄存器。

§6.7.6.3 函数声明符

13) 参数声明的声明说明符中的存储类说明符(如果存在)将被忽略,除非声明的参数是函数定义的参数类型列表的成员之一。

我已经这样声明和定义了......

int function(static int param)
{
    return param;
}

Visual Studio 发出警告。我的理解是,如果我们在函数的声明中使用register作为参数类型,它应该编译而没有警告。除了register,它将忽略存储类并向用户抛出警告消息。 我的理解正确吗?

谢谢

【问题讨论】:

  • 您能否包含 Visual Studio 给您的警告?
  • register 对现代编译器有影响吗?
  • @druciferre: 警告 C4042: 'param' : has bad storage class

标签: c


【解决方案1】:

我相信 6.7.6.3 是说存储类说明符在函数声明中被忽略;它表示除非参数是函数定义的参数类型列表的一部分,否则它会被忽略。由于您正在显示一个函数定义,因此编译器在此处忽略这个无效的存储类说明符是不合适的。

【讨论】:

  • 标准是说存储类说明符在函数声明中被忽略。所以我尝试使用声明“void mp(auto int);”。但我收到错误。错误:-错误:为未命名参数指定的存储类。你能告诉我为什么我在函数声明中有错误(因为存储类说明符在函数声明中被忽略,所以它不应该引发错误;)?
【解决方案2】:

首先,您使用Visual Studio 获得的编译器不符合c99/c11 标准。

函数definition 不应允许使用register 以外的存储类说明符。它应该将其标记为对存储类的不当使用。如前所述,VS 编译器不符合标准,它会抛出警告消息。

【讨论】:

    【解决方案3】:

    AS 说 Visual Studio 不符合 c99/c11 标准。
    这就是为什么这是作为警告抛出的原因。如果你用 gcc 编译..

    你会在函数声明和函数定义的地方得到error: storage class specified for parameter âparamâ

    你只能使用寄存器而不是其他的,比如静态,外部

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 2016-08-10
      相关资源
      最近更新 更多