用值定义和声明变量

时间:2011-02-25 14:59:09

标签: c declaration definition

刚开始使用K & R,在第2章中,有一行:

  

声明列出要变量的变量   使用和陈述他们有什么类型和   可能是他们的初始值

所以:

int x = 42定义

int x声明,但也是定义,因为每个定义都是声明

但是当我们分配一个像K & R这样的初始值时,是不是会使声明成为定义

2 个答案:

答案 0 :(得分:2)

你混淆了两件事:

  1. 声明声明(声明)对象的*类型,名称和范围是什么
  2. 定义定义对象的内容是什么
  3. *对象如:变量,函数等,而不是OOP对象。

    因此,定义通常也是一个声明,因为当您没有说明对象的类型是什么时,您无法定义对象中的内容。最容易记住的只是:“每个定义都是一个声明,但不是每个声明都是一个定义”

    对于变量

    在没有定义变量的情况下声明只有一种方法:

    extern typeX variable_name
    

    这告诉编译器有一个名为variable_name的变量,其类型为typeX,但不是从哪里获取它。 声明变量的每种其他方式也是一个定义,因为它告诉编译器为它保留空间并且可能给它一个初始值。

    结构和功能的区别更加清晰:

    对于Structs

    声明:

    struct some_struct{
        int a;
        int b;
    }
    

    这将使用a和b作为结构变量向编译器声明some_struct,类型为int。

    只有在您定义空间时,才会保留空间,您可以使用它们:

    void foo(){
        struct some_struct s;
        s.a = 1; // For this to work s needs to be defined
    }
    

    功能

    差异更明显

    声明:

    // This tells the compiler that there is a function called "foo" that returns void and takes void arguments
    void foo();
    

    定义可能与上面的定义相似(在结构部分中)

答案 1 :(得分:1)

基本上你可以说声明只是告诉编译器某个变量具有该名称和类型。它确实生成任何代码,而在C中,必须使用变量上的extern关键字来完成。函数原型(没有实现)也只是声明,不需要extern关键字,但您仍然可以提供它。 定义产生代码,例如在堆栈或堆上为变量或方法的主体分配内存。

从这个意义上讲,你的两个定义都是定义,任何定义也都是定义。

我认为这可能是K& R的错误......