【问题标题】:Will declaring a function generate any issues in the code声明一个函数会在代码中产生任何问题
【发布时间】:2013-09-14 12:18:24
【问题描述】:

在我的项目中,我有一个头文件 common.h,其中包含许多头文件。其中一些文件包括 Common.h 和一些其他头文件,它们已经存在于 Common .h 中,因此在预处理阶段有很多功能获得两次原型(一次来自 Included 标头,其他来自 Gui.h)。我想知道这是否会导致长期任何问题。

请建议..提前谢谢..

【问题讨论】:

  • 如果他们为每个翻译单元制作了两次原型,那么有人忘记了他们的 include-guard 栅栏。
  • #ifndef A #define A #endif#pragma once

标签: c++ c header prototype declaration


【解决方案1】:

标题应该有include guards,以便它们只被处理一次:

#ifndef SOME_UNIQUE_STRING
#define SOME_UNIQUE_STRING

// Everything else here

#endif

“一切”是指“一切”,从您的#includes 开始(如果有)。

SOME_UNIQUE_STRING 可以是模块的名称,只要它不太可能与其他地方的另一个定义一致。

如果你查看你的库头文件,你会发现它们使用了像这样的包含保护。

【讨论】:

  • 但我想知道两次原型制作是否有任何危害..?
  • 我无法想象它怎么会有任何 good ;) 是的,它会导致问题——最明显的是你无法编译都是因为重定义错误。
  • 一个函数的声明可以有任意多,不会造成任何问题。你只能有一个定义 - 除非函数被标记为inline
  • redefinition 错误在类型中更常见(如果您将结构定义放入并且对标头进行了两次处理,则编译可能会失败)。使用警卫只是一个养成的好习惯。幸运的是,在它们丢失时注意到问题并修复它通常非常简单。
【解决方案2】:

正如 Chemistpp 建议的那样,
#pragma once
是一个不错的选择,虽然它是非标准的。
查看链接中列出的优缺点。

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多