1
12
在C语言中,标识符有三种不同类型的“链接”:
一 定义。由于您的头文件定义了这样一个对象,并且包含在两个C文件中,所以它是未定义的行为(请参见下文)。C编译器不抱怨并不意味着可以在C中这样做。为此,您必须阅读C标准(或者,假设您的编译器中没有bug,如果在符合标准的模式下调用它,并且如果它抱怨某些东西[给出诊断],则可能意味着您的程序不符合标准。) 换句话说,您无法通过测试某些内容并检查编译器是否允许来测试语言允许的内容。为此,您必须阅读标准。 实验性的 定义。
现在编译它:
因此,在头文件中可能有一个暂定的定义。我们需要查看实际代码才能确定。
C++可能有不同的规则。
编辑
:根据
this thread on
(顺便说一句,该线程处理相同的问题。) 现在我几乎可以肯定,OP的代码包含了C文件在头文件中所称的“临时定义”,这使得它在C中合法,C++中是非法的。但是,只有当我们看到代码时,我们才能确定。 关于“暂定定义”以及为什么需要这些定义的更多信息,请参见本节 excellent post on comp.lang.c |
2
1
仅在标头中声明变量-使用显式
不同之处在于C++明确地要求一个定义规则——在C++程序中,只有一个给定的变量,具有外部链接。 严格来说,C标准也有同样的要求。然而,该标准的附录J列出了允许将多个未初始化定义视为一个定义的通用扩展-它被称为“通用定义”,因为它类似于(老式)Fortran(例如,Fortran IV、又名Fortran 66和Fortran 77)中的通用块的行为。 是的,如果您知道的足够多,不需要问这样的问题,那么偶尔,非常少,但只是偶尔,会有一个在标题中定义变量的原因。但这样的情况非常少,以至于说“不要在标题中定义变量”几乎足够准确。
克里斯托夫提出了一个有趣的观点:
它不会抱怨未使用的设备
|
daniel451 · 从源代码编译Python:多线程测试? 6 年前 |
mbalug · 为ARM编译c++源代码 6 年前 |
SuzLy · 使用flex编译简单令牌标识符 6 年前 |
user8659414 · Make无法识别我的库! 6 年前 |
Farzad · 序列化CUfunction对象 6 年前 |
Jersey · C++:何时需要重新编译有问题? 6 年前 |