【问题标题】:2 questions about header files and errors in C关于C中头文件和错误的2个问题
【发布时间】:2020-06-23 14:02:46
【问题描述】:
  1. 如果我有一个头文件,我在其中声明和定义了一个函数,并且我在源文件中包含了头文件,它会返回错误吗?如果是的话,是哪一个? 我尝试这样做并且有效,但是当其他人在他的 PC 上尝试时,它没有。 那么问题发生在哪一步呢?是预处理部分还是链接部分?
  2. 如果我定义同一个函数两次(两次在源文件中或一次在头文件中,另一个在源文件中),这是什么类型的错误? 我需要知道它以进行考试,但自己找不到答案

【问题讨论】:

  • 1) 不,你会没事的。但是,如果您在 两个 源文件中包含该标头,并尝试链接它们,那么您将收到链接器错误。 2) 叫什么?我不知道。
  • @Beta 不行。
  • “当其他人在他的 PC 上尝试它时,它没有”缺乏很多信息。发生了什么错误信息?

标签: c linker preprocessor


【解决方案1】:
  1. 我认为您应该首先收集有关该主题的一些信息 的联系。
  2. 那你应该对头文件描述做一些研究。
  3. 最后,您应该了解未定义的行为。
  4. Linkage
  5. Linkage 2
  6. Header File Create
  7. Undefined Behavior / UB

【讨论】:

    【解决方案2】:

    如果我有一个头文件,我在其中声明和定义了一个函数,并且我将头文件包含在源文件中,它会返回错误吗?如果是的话,是哪一个?我尝试这样做并且它有效,但是当其他人在他的 PC 上尝试它时,它没有。那么问题发生在哪一步呢?是预处理部分还是链接部分?

    这取决于。如果您在函数定义周围没有任何包含保护并且文件在同一个翻译单元中多次获得#included,或者如果在标头中定义的函数名称与在其他地方定义的另一个变量或函数名称冲突在源代码中,那么是的,您会得到某种重复或冲突的定义错误。如果标头中没有任何内容与其他代码冲突,则不会。不知道你的代码或者你朋友的代码的细节,真的没有办法明确回答。

    简短的回答是“不要那样做”——不要将函数或变量定义放在头文件中。这样你就完全避免了这种问题。

    如果我定义了两次相同的函数(两次在源文件中或一次在标题中,另一个在源中),那是什么类型的错误?我需要知道它以进行考试,但我自己找不到答案

    大多数编译器称其为“重复定义”错误。它没有正式定义的名称。以下是 C 语言定义中的相关文本:

    6.9 外部定义
    ...
    约束
    ...
    3 声明的每个标识符的外部定义不得超过一个 翻译单元中的内部链接。此外,如果使用 internal 声明的标识符 链接在表达式中使用(除了作为 sizeof 的操作数的一部分或 _Alignof 运算符,其结果是一个整数常量),应该正好有一个 翻译单元中标识符的外部定义。
    ...
    语义
    ...
    5 外部定义是一个外部声明,也是一个函数的定义 (内联定义除外)或对象。如果使用外部声明的标识符 链接在表达式中使用(除了作为 sizeof 的操作数的一部分或 _Alignof 运算符,其结果是一个整数常量),在整个 程序中的标识符应该只有一个外部定义;否则,有 不得超过一个。161)
    161) 因此,如果用外部链接声明的标识符未在表达式中使用,则不需要 它的外部定义。
    C 2011 Online Draft

    【讨论】:

      【解决方案3】:

      经验法则 - 不要在头文件中放置任何代码(即函数定义)或变量定义。

      有一些可能的例外(例如静态内联函数)。

      头文件: 函数声明、类型声明和外部对象定义。

      源文件: 函数体和数据定义。

      【讨论】:

      • 是的,我完全意识到这一点,我问它只是因为他们可能会问我们做这种事情的后果,所以如果某些事情不被推荐或不可接受但仍然有效,我需要知道它
      • 自己试试吧.. 将具有函数和数据定义的相同头文件包含到两个 c 文件中。链接他们
      猜你喜欢
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      相关资源
      最近更新 更多