我对申报和定义感到困惑。
声明
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:'持续时间': 重新定义;不同的基本类型
答案 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
称为虚拟变量。