【问题标题】:Where is the phrase "declaration of" defined in the C standard or else how should it be interpreted?C标准中定义的短语“声明”在哪里,否则应该如何解释?
【发布时间】:2016-05-05 00:01:30
【问题描述】:

我无法在当前标准中找到该短语的任何定义。有没有要不然怎么解释?

除了“声明”在英语中的含义外,它也在 C 语言中明确定义 - 有一整节关于它。

考虑一下这篇用英文写的帖子,没有任何隐藏的 C 含义(如果有任何由 C 标准定义的话)。

以这种方式思考这个问题 - 作为一个全新语言的问题。忘记你所知道的关于“C”的一切,然后试着只根据标准和应该阅读的方式来回答我的问题(你也可以帮助我)。

也许它在标准 ($2) 中引用的规范性参考文献中的某处进行了定义:

1 以下参考文件是必不可少的 本文件的应用。对于过时的参考文献,只有版本 引用适用。对于未注明日期的参考资料,最新版本的 参考文件(包括任何修改)适用。

2 ISO/IEC 2382−1:1993,信息技术 — 词汇 — 第 1 部分:基础 条款。

3 ISO 4217,用于表示货币和 资金。

4 ISO 8601,数据元素和交换格式——信息 交换——日期和时间的表示。

5 ISO/IEC 10646, 信息技术——通用编码字符集 (UCS)。

6 国际电工委员会 60559:1989,微处理器的二进制浮点运算 系统(以前指定为 IEC 559:1989)。

7 ISO 80000−2, 数量和单位 - 第 2 部分:数学符号和符号 用于自然科学和技术。

更具体地说,这个问题旨在成为另一个问题的前传 - 关于类型名称。目前它们的含义没有具体说明。只有它们的语法被认为与省略标识符的声明相同(尽管目前它们有一个不同的语法部分)。

所以当我们最终弄清楚“声明”的含义时,我们将能够理解应该如何阅读这样的代码:

void func(struct { int _1, _2; } );

int main()
{
   func((struct { int _1, _2; }){2, 3});
}

因为这个复合文字是否被认为是一个不包含标签的结构的声明?这是哪里说的?

据我所见 - 无处。

另一方面,复合文字本身包含 type-name。

$6.5.2.5 (p3):

由括号括起来的类型名称组成的后缀表达式 后跟一个括号括起来的初始化器列表是一个复合 文字。它提供了一个未命名的对象,其值由 初始化列表。

如果我们应用常识,类型名称是没有标识符的声明,并且“x 的声明”意味着引入具有特定类型 x 的标识符的声明,那么一切都很好。但是类型名真的是声明吗?

是的,类型名称语法是没有标识符的声明,但这是关于它们的语法,仅此而已。它们仍然是不同的实体 - 类型名称(而不是声明)。引用 6.7.7 (p2):

在几种情况下,有必要指定一个类型。这是 使用类型名称完成,在语法上是一个声明 用于省略标识符的该类型的函数或对象。

综上所述,这两种类型 - 复合文字中的函数参数和类型名称相同吗?

记住(从标准)$6.7.2.3(p5):

结构、联合或枚举类型的两个声明 不同的范围或使用不同的标签声明不同的类型。 每个 结构、联合或枚举类型的声明 包含一个标签声明了一个不同的类型。

这就是我要问的,但后来我看到论文中的任何地方都没有明确指定“声明”的含义,我想知道它到底是什么意思。

我开始把这个 ANSI 标准看成一团糟,没人愿意详细解释。

【问题讨论】:

  • 您没有正确搜索。
  • 好吧,我确实搜索了一段时间,但也许我错过了一些东西。也许你可以帮助我。
  • 你可以从这里开始:Google search of C "declaration of".
  • 我宁愿根据标准论文寻找解释。
  • 当我们考虑 c 语言的本质以及它的标识符是如何出现的时候,我认为这是一个很好的问题;似乎我们不知何故忘记了这种美丽语言的根源。随着时间的推移,这似乎在大多数人类语言中都会发生。

标签: c language-lawyer


【解决方案1】:

你可以自己搜索最新的online draft,但是没有“声明”这个词组的正式定义;它根本不符合标准的英语用法。

例如,

char arr[10];

是一个声明,它声明的东西是一个char的10元素数组;换句话说,它是一个数组的声明。

同样

void foo( void );

是一个声明,它声明的东西是一个不带参数并返回void的函数;它是一个函数的声明。

"X is a declaration of Y" 简单地表示声明X与实体Y相关联>,不多也不少。

【讨论】:

    【解决方案2】:

    标准说:

    C11-§6.7:

    语法
    1

    declaration:  
        declaration-specifiers init-declarator-listopt ;
        static_assert-declaration  
    
    declaration-specifiers:
        storage-class-specifier declaration-specifiersopt   
        type-specifier declaration-specifiersopt   
        type-qualifier declaration-specifiersopt   
        function-specifier declaration-specifiersopt   
        alignment-specifier declaration-specifiersopt  
    
    init-declarator-list:  
        init-declarator
        init-declarator-list , init-declarator  
    
    init-declarator:   
        declarator
        declarator = initializer
    

    5 声明指定一组标识符的解释和属性。

    例如:

    extern int a;     // Declaration
    void foo(int a);  // Declaration  
    extern b[10];     // Declaration  
    
    extern int c  = 0                              // Declaration as well as Definition 
    int d;                                         // Declaration as well as Definition 
    int foo(int a) { printf("%zu\n", sizeof(a)); } // Declaration as well as Definition   
    

    来自标准 (6.7.6.1/4) 的示例

    声明常量指针constant_ptr 可以通过包含“指向int 的指针”类型的定义来阐明。

          typedef int *int_ptr;
          const int_ptr constant_ptr;  
    

    将constant_ptr 声明为具有“指向int 的常量限定指针”类型的对象。

    【讨论】:

    • ...与其定义相反。
    • 那么你认为“声明”的意思是常识吗?
    • 我真的不认为引用标准可以任何来解释它。
    • @WeatherVane;他说他在现行标准中没有找到任何有意义的解释。
    • @FISOCPP;它不是常识。参见syntax中提到的“声明”的语法。
    【解决方案3】:

    英文单词“declare”有多种用法,大致意思是“公开陈述”或“公开讲述”某事。 “宣言”的意思类似于“公开声明”,例如“宣战”或“独立宣言”。

    但像许多技术术语一样,它在 C 标准中具有更具体和精确的含义。你可以从语法上看,它只是意味着一个声明是一个C程序的一个语法元素,它可以出现在程序中的某些地方,并且遵循一定的语法规则。或者您可以从语义上看它的含义:标准说,声明“指定了一组标识符的解释和属性”。

    这是一个 C 程序的一小部分:

    smurfed4life / gargle
    

    / 是一个运算符,表示除法,但是什么样的除法? 要确定这一点,我们查看smurfed4life 和gargle。它们是标识符,是的,标识符用作事物的名称,但是什么事物呢?为了找出答案,我们回到声明。

    假设我们找到了这些声明:

    int smurfed4life;
    const float gargle;
    

    现在我们知道smurfed4life是一个数据类型为int的变量,所以它可以用来存储一个普通的整数。 gargle 是float 类型的变量,因此可以用来存储(单精度)浮点数。它也是恒定的。这是我们可以从声明中学到的。现在,根据C语言的规则,除法将是浮点除法,而不是整数除法。

    【讨论】:

    • 按标准?我知道那是什么。再读一遍我的问题(或者你不能读,因为我的英语不值得)。
    • @FISOCPP:标准说“指定解释和属性”,我试图解释这一点。我还没有发现标准是否更多地说明了“解释”或“属性”。
    • 我开始觉得我在这里错过了一些重要的东西。我在说的是表达(用英语)“声明” - 它是在标准中的某处明确定义还是应该在没有这样的情况下理解?
    • @FISOCPP:我试图解释语义(即含义),但也许最好说“声明”,正如 C 标准中使用的术语,是句法C 程序的元素。它可以出现在程序的某些地方,并且遵循一定的句法规则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    相关资源
    最近更新 更多