【问题标题】:Difference between "defining" and "declaring" [duplicate]“定义”和“声明”之间的区别[重复]
【发布时间】:2011-05-23 15:18:55
【问题描述】:

可能重复:
What is the difference between a definition and a declaration?

我正在尝试彻底理解 C 中的“定义”和“声明”。

我相信这里定义了x,因为外部变量会自动初始化为0,并且定义了声明和初始化的东西。准确吗?

int x;
main() {}

在这种情况下,x 是一个定义,但为什么呢?它没有被初始化...

int print_hello()
{
  int x;
}

【问题讨论】:

  • 阅读this答案。

标签: c initialization terminology declaration definition


【解决方案1】:

声明是告诉编译器有一个看起来像这样的变量。

定义是告诉编译器这是一个变量。

一指事物的存在,二指事物。

在您的示例中,作用域是与众不同的。声明是在文件范围内进行的,但在块范围内是不可能声明任何东西的;因此,第二个例子是一个定义;因为,与int x; 无关。

这使得第一个示例(在文件范围内)声明了一些 int x; 存在。要从声明中隐藏它,您需要指定为其分配一个值,从而强制分配内存。像这样:int x = 0;

C 和 C++ 在分析构造时对范围非常敏感。

【讨论】:

  • 谢谢,但我明白了很多:) 编辑:所以,它的定义是因为那是唯一的选择??我想我只需要解决这个问题。
  • 抱歉,我提交的太早了,所以我不得不编辑它以添加处理您实际问题的部分。
  • 但他的第一个例子也是一个定义,不是吗?
  • 其实第一个例子不是定义,只是声明。要将其转换为定义,您需要为其分配一个值。 C 和 C++ 之间的规则略有不同。这就是强制使用 extern 关键字要好得多的原因。
  • 第一个绝对是一个定义..我认为
【解决方案2】:

“定义”并不意味着“初始化”。这意味着创建了某些东西,而不仅仅是引用。

定义分配但不一定初始化内存。这可以带来有趣的调试。

【讨论】:

  • 所以即使一个变量没有被初始化,它也可以被定义?但我在这里读到了定义 = 声明 + 初始化 - ubuntuforums.org/showthread.php?t=1501482&page=1
  • 来自 c-faq: "definition - n. 1. 变量或函数的声明,它分配和可选地初始化(在变量的情况下)或提供函数体(在一个函数)。” -- c-faq.com/sx1/index.html#definition
  • 应该读过...好的,所以答案是肯定的。即使一个变量没有被初始化,它也可以被定义。关键是必须为定义分配内存?
  • 对于变量,是的,定义分配内存。还有其他,嗯,其他构造的定义。共同点是可以有一个定义,但可以有多个声明。
【解决方案3】:

声明在 TU 中引入了一个名称。定义为该名称实例化/分配存储空间。

int x; //definition,also a declaration. Every definition is a declaration.
int main(){}

【讨论】:

    猜你喜欢
    • 2016-04-20
    • 1970-01-01
    • 2014-11-21
    • 2020-01-28
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多