编译器设计中的定义和声明有什么区别?