我不明白两者的意义。
当前回答
为了理解名词,我们先来看看动词。
声明- - - - - - 宣布:正式宣布;宣告
定义- - - - - - 清晰完整地显示或描述(某人或某事
所以,当你声明某物时,你只需告诉它是什么。
// declaration
int sum(int, int);
这一行声明了一个名为sum的C函数,它接受两个int类型的参数并返回一个int。但是,您还不能使用它。
当你提供它的实际工作方式时,这就是它的定义。
// definition
int sum(int x, int y)
{
return x + y;
}
其他回答
当您使用extern存储类时,声明和定义的概念将形成一个陷阱,因为您的定义将位于其他位置,而您是在本地代码文件(页面)中声明变量。C和c++之间的一个区别是,在C中,声明通常在函数或代码页的开头完成。在c++中不是这样的。你可以在你选择的地方申报。
为了理解声明和定义之间的区别,我们需要查看程序集代码:
uint8_t ui8 = 5; | movb $0x5,-0x45(%rbp)
int i = 5; | movl $0x5,-0x3c(%rbp)
uint32_t ui32 = 5; | movl $0x5,-0x38(%rbp)
uint64_t ui64 = 5; | movq $0x5,-0x10(%rbp)
double doub = 5; | movsd 0x328(%rip),%xmm0 # 0x400a20
movsd %xmm0,-0x8(%rbp)
这只是定义:
ui8 = 5; | movb $0x5,-0x45(%rbp)
i = 5; | movl $0x5,-0x3c(%rbp)
ui32 = 5; | movl $0x5,-0x38(%rbp)
ui64 = 5; | movq $0x5,-0x10(%rbp)
doub = 5; | movsd 0x328(%rip),%xmm0 # 0x400a20
movsd %xmm0,-0x8(%rbp)
正如你所看到的,没有任何变化。
声明与定义不同,因为声明提供的信息仅供编译器使用。例如uint8_t告诉编译器使用asm函数movb。
看到:
uint def; | no instructions
printf("some stuff..."); | [...] callq 0x400450 <printf@plt>
def=5; | movb $0x5,-0x45(%rbp)
声明没有等价的指令,因为它不是要执行的东西。
此外,声明告诉编译器变量的作用域。
我们可以说,声明是编译器用来确定正确使用变量的信息,以及某些内存属于某个变量多长时间。
定义:
extern int a; // Declaration
int a; // Definition
a = 10 // Initialization
int b = 10; // Definition & Initialization
定义将变量与类型关联起来并分配内存,而声明只指定类型而不分配内存。当您希望在定义之前引用变量时,声明更有用。
*不要混淆定义和初始化。两者是不同的,初始化给变量赋值。参见上面的例子。
下面是一些定义的例子。
int a;
float b;
double c;
现在函数声明:
int fun(int a,int b);
注意函数末尾的分号,所以它表示它只是一个声明。编译器知道在程序的某个地方,该函数将被定义为原型。现在,如果编译器得到一个这样的函数调用
int b=fun(x,y,z);
编译器将抛出一个错误,指出没有这样的函数。因为它没有那个函数的原型。
注意两个程序之间的区别。
程序1
#include <stdio.h>
void print(int a)
{
printf("%d",a);
}
main()
{
print(5);
}
其中,print函数也被声明和定义。因为函数调用在定义之后。现在看下一个节目。
项目2
#include <stdio.h>
void print(int a); // In this case this is essential
main()
{
print(5);
}
void print(int a)
{
printf("%d",a);
}
这是必要的,因为函数调用先于定义,所以编译器必须知道是否有这样的函数。因此,我们声明了一个函数,该函数将通知编译器。
定义:
定义函数的这一部分称为定义。它告诉我们在函数中要做什么。
void print(int a)
{
printf("%d",a);
}
定义意味着实际编写的函数,声明意味着简单的声明函数 如。
void myfunction(); //this is simple declaration
and
void myfunction()
{
some statement;
}
这是函数myfunction的定义
声明意味着给变量命名和类型(在变量声明的情况下),例如:
int i;
或者将名称、返回类型和参数类型赋给一个没有函数体的函数(在函数声明的情况下),例如:
int max(int, int);
而定义意味着给变量赋值(在变量定义的情况下),例如:
i = 20;
或者为函数提供/添加函数体(功能)被称为函数定义,例如:
int max(int a, int b)
{
if(a>b) return a;
return b;
}
许多时间声明和定义可以一起完成:
int i=20;
and:
int max(int a, int b)
{
if(a>b) return a;
return b;
}
在上述情况下,我们定义并声明变量i和函数max()。