声明或定义

时间:2010-10-03 02:48:39

标签: c++ declaration definition

我对申报和定义感到困惑。

声明

int switchon(float duration);

Q1。参数'duration'是定义的还是被声明?

根据神圣标准第3.1 / 2节,这是一个定义,但我无法理解为什么。

Q2。声明和定义之间的确切区别是什么?

C ++在Nutshell中说

  

定义定义存储,   价值,身体或内容   宣言。 a之间的区别   声明和定义是一个   声明告诉你一个实体的名字   和实体的外部观点,   例如对象的类型或   函数的参数,和   定义提供内部   实体的运作:存储   和对象的初始值,a   功能体,等等。

“定义和声明”的定义也无助于我理解为什么“持续时间”是一个定义而不是上述声明中的声明。

REDIT:

UncleO的帖子给了我一个想法,这就是我的尝试:

我将代码更改为:

int switchon(float duration, int duration);   // idea is to see what error 
                                              // compiler gives

int main()  {  }
  

错误C2371:'持续时间':   重新定义;不同的基本类型

6 个答案:

答案 0 :(得分:1)

回答Q1:

标识符“duration”未定义或声明。 “switchon”是在此语句中声明的标识符,作为float参数返回int的函数。

这里使用“duration”是可选的,这使得从其他地方的函数定义中剪切和粘贴更容易,但没有任何意义。

编辑:

多么令人讨厌的变化!

int switchon(float duration, int duration); // idea is to see what error compiler gives

int main() { }

error C2371: 'duration' : redefinition; different basic types 

这是一个抛出此错误的特定编译器,因此不一定是明确的。这个例子确实导致了错误的代码,但在我看来,它不应该抛出那个特定的错误。

另一方面,

int switchon(float duration, int duration){ return 0; }

int main() { }

应该导致上面给出的重新定义错误。在这种情况下,正在定义switchon,这意味着float duration和int duration被定义为具有相同名称的同一范围内的参数。

可能是编译器过于热心,或者在两种情况下都使用相同的机制来解析函数。这在第二种情况下肯定是一个错误,在第一种情况下只是一个坏主意,因此它在两者中都会引发错误并不是一件坏事。

对Q2的回答:差异正如本节所述,也在此duplicate中解释

答案 1 :(得分:1)

C和C ++之间的术语定义的定义有所不同。这种差异并不为人所知(我只是在研究这个问题时才发现),大多数人和书籍也在C ++语境中使用C定义。

在C中,声明也是一个定义,如果它具有< choose from set>额外的财产 在C ++中,声明总是一个定义,除非它是< choose from set>。> br />之一。 对于大多数实际目的,定义的定义之间的差异没有任何区别,直到您开始查看极端情况。

在C中,函数原型中的struct-member和参数是 not 定义,因为它们没有为声明的对象保留内存所需的属性。
在C ++中,struct(或类)成员变量和原型中的参数是定义,因为它们不属于排除列表。

我认为这种差异是不必要的,也是不幸的,因为它比理解宣言和定义之间的区别更加困难。

  

Q1。参数'duration'是定义的还是被声明?

根据C ++标准的字面读数,它正在被定义。但是我希望这是标准中的缺陷,因为声明对我来说更有意义。

<报价>

int switchon(float duration, int duration);   // idea is to see what error 
                                              // compiler gives

int main()  {  }
error C2371: 'duration' : redefinition; different basic types

< /报价>

最有可能的是,你会得到同样的错误:

extern float duration;
extern int duration;

这些都是声明,但编译器诊断可能不会反映出来。

答案 2 :(得分:0)

该行:

int switchon(float duration);

是一个声明,因为您指定了该函数的签名。此时,形式参数的名称是可选的。

A1:您正在声明参数的事实。

A2:声明是指定函数签名的位置,而定义是指定实现和形式参数名称的位置。

答案 3 :(得分:0)

我想我知道我错了,我也把两个混淆了。无论如何,这里没有给出价值。你在调用函数时给它一个值。

例如,告诉我单独使用此示例的持续时间的值/内容是什么?你不能。因此,这是一个宣言。

答案 4 :(得分:0)

Q1:这是一个声明,因为没有为“switchon”功能提供实际的实现。如果是这样的话:

int switchon(float duration) { // do sth with duration return result; }

然后,它将是一个定义(b / c提供所有细节)。

Q2:声明仅提供签名,而定义则定义函数实际执行的操作。

答案 5 :(得分:0)

int switchon(float duration);

功能原型 / 声明,只是澄清订单&传递给函数的类型参数及其返回值类型。

仅在整个函数定义(即调用函数时程序执行的操作)放在某个其他函数中调用switchon()后放置的情况下才有必要,很可能是main()

在这方面,函数原型中使用的所有变量名都只是占位符,可以安全地省略。 所以,您的陈述也可以阅读,

int switchon(float);

由于变量名是可选的,因此根据标准的定义(无意图),这仅归结为函数声明

出于此目的,某些教科书会将您的第一个原型中的duration称为虚拟变量