【问题标题】:Variable definition and memory allocation in CC中的变量定义和内存分配
【发布时间】:2015-02-23 11:48:53
【问题描述】:

作为C语言的初学者,我想知道对于同一变量的双重定义的内存分配结果是什么,即:

第一个文件:file.h

int data;

第二个文件:main.c

#include "file.h"
...
int data = 56;
...

【问题讨论】:

  • 那行不通,因为你要声明变量两次。
  • 那甚至编译了吗?这与在main 中使用int data;int data=56; 相同,这是无效的,因为在同一范围内不能有多个同名变量。 #include file.h 也是错误的。
  • 在显示的情况下,没有任何有趣的事情发生,隐式初始化为 0 稍后被显式初始化覆盖。一旦程序的另一个文件包含 file.h,这可能会导致多重定义错误(取决于编译器和链接器,C 标准呈现未定义)。 TL;DR:不要将这样的定义放入标题中,而是使用extern int data;

标签: c memory allocation definition


【解决方案1】:

第 1 点。#include file.h 是错误的。你至少需要写#include "file.h"

第 2 点。这个概念本身也是错误的,因为两个变量都在全局空间中。它会给你多个定义错误。

注意:但是,如果您在函数内部执行int data = 56;,则没问题,因为到那时,它将成为该函数的局部变量

另外,我建议阅读有关include guard 的内容。否则,如果你在头文件中定义变量,在一个源文件中多次包含头文件也会产生多重定义错误。

最佳实践:

  • 声明头文件中的变量。 [extern int data;]
  • 定义(其中一个)源文件中的变量。 [int data = 56;/int data;]

【讨论】:

  • 允许多个暂定定义;显示的标头可以包含多次(由同一个文件),但不能由多个源文件包含,并且包含保护不会阻止。
  • @mafso 对。这就是我提到最佳实践案例的原因。
  • 我不质疑“最佳实践”,但 1)“它会给你带来多重定义错误。” -- 仅当包含在多个文件中并且它仍然依赖于编译器和链接器时,例如,Linux 上的 Gcc 接受它。 2)“否则,如果你在头文件中定义变量,在一个源文件中多次包含头文件也会产生多重定义错误。” -- 这是错误和误导性的。
  • @mafso,如果我错了,请纠正我,但我相信这与显式初始化有关。如果在头文件中写int data = 5;,那么所有情况都会产生redefinition of data错误。不是吗?
  • 对于可移植的 C 代码:隐式初始化(​​“暂定定义”)可能会被同一翻译单元中的显式初始化覆盖。多个显式初始化未定义,多个定义不在同一个 TU 中。
【解决方案2】:

如果你想双重声明一个变量,使用

extern int data;

file.h.

更多关于extern variables的内容。

另外#include file.h写错了,请写"#include "file.h"

【讨论】:

    【解决方案3】:

    实际上两者是相同的。
    int data; 1. 在此您声明一个整数变量而不初始化其值。

    #include file.h
    ...
    int data = 56;
    ...
    
    1. 在这里,您声明了一个没有初始化的整数变量。 因为变量数据的两个声明都在同一个文件上。所以它会显示错误。 一个变量不能在同一个文件(作用域)中声明两次。

    【讨论】:

      猜你喜欢
      • 2017-01-19
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      相关资源
      最近更新 更多