【问题标题】:Is it okay to have a function declaration more than once in a single cpp file?可以在一个 cpp 文件中多次声明函数吗?
【发布时间】:2016-11-29 00:47:07
【问题描述】:

根据sbithis question的回答,

可以根据需要多次声明标识符(语句 1)

难道不是真的

C++ 中的 include guard 只是阻止函数声明 在单个源文件中多次出现(语句 2)

?

我的问题是:为什么会出现这种矛盾?还是我误解了这两种说法中的任何一种?

【问题讨论】:

  • 没有。包含保护防止 header 被多次包含。根据作用域,一个标识符可以在无数文件或单个文件中被声明无数次。
  • 必须保护类定义
  • 稍微重读一下,只要标识符的类型不变,范围甚至可以被忽略,因为 sbi 谈论的是声明,而不是定义。
  • 这里是一个简单的例子:ideone.com/hkS3Zc
  • @Nicholas 想一想#include <string> 必须有多少个标头您想一遍又一遍地处理class string { whole lotta code here }; 吗?然后考虑编译器必须清除和忽略的所有模板和内联函数,因为它们是相同的。最重要的是,如果某个傻瓜确实在标题中定义了一个变量怎么办?现在,您可能拥有同一个变量的数十个副本和一个非常愤怒的链接器。

标签: c++ compilation linker include c-preprocessor


【解决方案1】:

是的,您可以在一个翻译单元中多次声明(但不能定义)一个函数。是的,包括警卫通常会防止这种情况发生,但这不是他们唯一的目的。标头通常定义类、模板和内联函数;需要标头保护来防止这些实体的多个定义出现在单个翻译单元中。标头保护还有助于防止标头粘贴到翻译单元的次数呈指数级增长。

【讨论】:

  • 您是否建议include guard 本质上防止重复定义,而不是声明,并且只有前者会触发错误?我还是有点困惑。我在想#include " .h" 在预处理期间从字面上复制并粘贴头文件中的内容,因此具有#include " .h" 的源文件在预处理后将没有任何定义,因为我们通常在单独的 cpp 文件(以及它在 header 中的声明),那么翻译单元怎么会有实体的多个定义呢?
  • @Nicholas 包含防护可防止其防护的内容在翻译单元中多次出现。这可能包括:非内联函数声明、内联函数定义、类定义、模板定义。还有其他类型的声明,但这些是最重要的情况。
  • “这不是他们唯一的目的”——没错。但它甚至比这更强大:如果您的标头包含 only 声明,则根本不需要包含警卫。这是所有其他必须保护的东西。
猜你喜欢
  • 2014-01-31
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 2020-08-04
  • 2016-02-29
  • 2011-05-22
相关资源
最近更新 更多