短语""的声明在哪里?在C标准中定义,或者如何解释?

时间:2016-01-27 20:33:30

标签: c language-lawyer

我无法在当前标准中找到此短语的任何定义。是否应该解释?

除了"声明"用英语表示,它也在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 IEC   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(第2页):

  

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

所有说的都是两种类型 - 函数参数和复合文字中的类型名称相同吗?

请记住(来自标准)$ 6.7.2.3(p5):

  

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

那是我要问的问题,但后来我看到"""没有在论文的任何地方明确指定含义,我想知道它究竟是什么意思。

我开始认为这个ANSI标准完全混乱,没有人愿意详细解释。

3 个答案:

答案 0 :(得分:2)

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

例如,

char arr[10];

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

类似地

void foo( void );

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

X Y 的声明”仅表示声明 X 与实体 Y ,或多或少。

答案 1 :(得分:0)

标准说:

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声明为具有“const-qualified指向int”类型的对象。

答案 2 :(得分:0)

英文单词&#34;声明&#34;以各种方式使用,意思是大约公开陈述&#34;或者公开告诉&#34;一些东西。 A&#34;声明&#34;意味着类似于&#34;公开声明&#34;,如&#34;战争宣言&#34;或&#34;独立宣言&#34;。

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

以下是C程序的一小部分:

smurfed4life / gargle

/是一个运算符并且意味着除法,但是什么类型的划分?为了做出决定,我们会查看smurfed4lifegargle。它们是标识符,是的,标识符用作事物的名称,但是什么东西呢?为了找到答案,我们回到声明

我们说我们找到了这些声明:

int smurfed4life;
const float gargle;

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