我有一个头文件A.h
,其中我定义了const int ID = 4;
。我已将此头文件包含在C文件A.c
和main.c
中。我使用了标头保护#ifndef A_H #define A_H
等。但是当我尝试编译代码时,我收到错误multiple definition of ID
。
我在某处读过,在大多数情况下,使用#pragma once
可以避免这种情况,但我仍然会收到错误。
我的问题是如何在C中定义变量?我是否应该将ID的定义移动到C文件,但是我必须在我使用的每个文件中声明它?或者在这种情况下使用extern
唯一的方法?
答案 0 :(得分:2)
在C中,每个对象只允许一个定义。如果您有多个.o
文件(编译单元),则包含警卫和类似操作对此没有帮助。他们每个都有一个副本,这是不允许的。
如果您不需要该对象的地址而您只对其常量值感兴趣,则可以将其替换为
enum { ID = 4 };
这定义了一个类型为ID
的命名值int
,您可以轻松将其放入头文件中。
答案 1 :(得分:1)
是的,使用extern
是唯一的解决方案。 pragma
或包含防范多个包含在同一翻译单元中的警卫,这是一个多重定义错误。
答案 2 :(得分:-1)
当你将一个整数变量定义为const时,编译器可能并且经常会在使用该变量时插入该值,并且永远不会为它分配存储
获取标识符的地址时会发生异常。在这种情况下,存储大多数是分配的,如果声明在头文件中,则会发生多个定义。
在这种情况下,您别无选择,只能使用extern
。