【问题标题】:C Preprocessor Guards?C 预处理器守卫?
【发布时间】:2013-04-01 21:17:58
【问题描述】:

我正在处理一个C 项目,并且正在尝试使用可在 C++ 中使用的预处理器防护:

#ifndef CONFIG_H
#define CONFIG_H

... exciting stuff in C ....

#endif

在我的源代码中包含这个似乎在 Visual Studio 中没有效果,因为当我在多个文件中包含给定文件(例如 Config.h)时,编译器会给出以下错误:

1>main.obj : error LNK2005: _OPCodes already defined in lib.obj
1>main.obj : error LNK2005: _OPTotal already defined in lib.obj
1>main.obj : error LNK2005: _RegCodes already defined in lib.obj
1>main.obj : error LNK2005: _RegTotal already defined in lib.obj
1>main.obj : error LNK2005: _UDSTotal already defined in lib.obj

谁能给我任何指点(不是双关语)吗?

【问题讨论】:

  • #define CONFIG_G 应该是#define CONFIG_H
  • @maditya 抱歉,现在是凌晨 3 点,这是我的帖子中的错字。现已修复,但仍无法正常工作。
  • 当你说“在我的源代码中包含这个”时,你的意思是你把包含保护放在标题中,而不是放在 .cpp 文件中,对吗?在任何情况下,尝试将#pragma once 也放在那里,看看会发生什么。
  • 我怀疑 AProgrammer 的回答是正确的。

标签: c++ c c-preprocessor guard


【解决方案1】:

守卫将防止在编译单元中定义两次。它们不会阻止在不同的编译单元中定义相同的东西。链接器消息表明这是_OPCodes 发生的情况,例如在libmain 中定义。

通常,头文件应该只有函数和全局变量的声明,相应的定义将在源文件之一中提供。

(请参阅What is the difference between a definition and a declaration? 了解更多信息)

【讨论】:

  • 谢谢你,这是我问题的答案。我(愚蠢地)在我的.h 文件中定义了一些东西。将它们移至.c,我的问题就消失了。
【解决方案2】:

如果您重命名了任何文件,则应将它们从解决方案中删除并重新添加。有时 Visual Studio 对此有点奇怪,当它们留在里面时会导致链接器错误。

确保进行重建。

您也可能不小心包含了.cpp 文件而不是.h 文件。仔细检查所有包含以防万一。

【讨论】:

    【解决方案3】:

    编辑:这是基于原始帖子,其中有一个错字。显然,这不是 OP 的真正问题。

    你给你的守卫起了两个不同的名字。它们必须匹配。

    #ifndef CONFIG_H
    #define CONFIG_H  // not CONFIG_G!
    

    【讨论】:

    • 抱歉,现在是凌晨 3 点,是我的帖子中的一个错字。现已修复,但仍无法正常工作。
    • 尝试添加#pragma once 只是为了好玩,看看是否可以解决问题。如果不是,那么您的问题不在此头文件中。如果是这样,您可能将您的#endif 放在错误的位置或类似的地方。在任何情况下,添加#pragma once 不会有任何伤害,而且它可以稍微加快编译速度。 (不过可能不会。)
    【解决方案4】:
    #ifndef CONFIG_H
    #define CONFIG_G
    
    ... exciting stuff in C ....
    
    #endif
    

    这是一个错字,因为您收到“已定义错误”

    在您的头文件中,您定义的是 CONFIG_G 而不是 CONFIG_H ,因此从下一个源文件中 #ifndef CONFIG_H 为真,因此它再次包含相同的内容

    【讨论】:

    • 抱歉,现在是凌晨 3 点,是我的帖子中的错字。现已修复,但仍无法正常工作。
    猜你喜欢
    • 2011-12-22
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2019-04-25
    相关资源
    最近更新 更多