我无法在当前标准中找到此短语的任何定义。是否应该解释?
除了"声明"用英语表示,它也在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标准完全混乱,没有人愿意详细解释。
答案 0 :(得分:2)
您可以自己搜索最新的online draft,但没有正式定义“声明”;它只是不符合标准英语用法。
例如,
char arr[10];
是一个声明,它声明的是一个10个元素的char
数组;换句话说,它是数组的声明。
类似地
void foo( void );
是一个声明,它声明的是一个不带参数的函数并返回void
;它是函数的声明。
“ X 是 Y 的声明”仅表示声明 X 与实体 Y ,或多或少。
答案 1 :(得分:0)
标准说:
C11-§6.7:
<强>语法强>
1declaration: 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
/
是一个运算符并且意味着除法,但是什么类型的划分?为了做出决定,我们会查看smurfed4life
和gargle
。它们是标识符,是的,标识符用作事物的名称,但是什么东西呢?为了找到答案,我们回到声明。
我们说我们找到了这些声明:
int smurfed4life;
const float gargle;
现在我们知道smurfed4life
是一个数据类型为int
的变量,因此它可以用来存储一个普通的整数。 gargle
是float
类型的变量,因此可用于存储(单精度)浮点数。它也是不变的。这是我们可以从声明中学到的东西。现在,根据C语言的规则,除法将是浮点除法,而不是整数除法。