【问题标题】:GCC compiler error: "redefinition...previously defined"GCC 编译器错误:“重新定义...以前定义”
【发布时间】:2010-10-17 00:20:00
【问题描述】:

我收到很多“重新定义 x....x 之前在这里定义的内容”。请问这个错误是什么意思?

【问题讨论】:

    标签: c++ gcc compiler-construction


    【解决方案1】:

    您需要限制每个文件只包含一次。您可以通过 2 种方式做到这一点。

    1) 在头文件的顶部放置:

    #pragma once
    

    或 2) 如果您的编译器不支持,请将其放在头文件的顶部/末尾:

    #ifndef _MYFILE_H_
    #define _MYFILE_H_
    ...
    #endif
    

    将 MYFILE 替换为您的文件名,并将 ... 替换为头文件的内容。

    【讨论】:

    • 我认为#pragma 仅适用于 VC++,不适用于 gcc。 #define 技巧是可移植的。
    • 维基百科说#pragma once 得到 VC++ 和 gcc en.wikipedia.org/wiki/Pragma_once 的支持。
    • #pragma 与 gcc 配合得很好。我在读到它之后就在使用它,它解决了很多错误!
    【解决方案2】:

    错误意味着有一个符号已在一个地方定义,而另一个定义已在另一个地方进行。

    在以下情况下可能会发生这种情况:

    • 如果你定义了两个同名的函数
    • 如果函数与其原型不匹配
    • 您在定义之前调用了一个重要的函数,并且没有原型

    在最后一种情况下,实际函数与编译器在没有原型可供使用时假定的“隐式声明”之间存在不匹配。

    这些情况可以通过以下方式避免:

    • 确保函数原型只声明一次
    • 确保所有函数在其范围内具有唯一名称(即,如果它们是 static,则在文件中,或者如果它们在目标文件之间使用,则它们是唯一的)
    • 在源文件中使用extern 语句来声明原型时要小心。最好使用相应头文件中的原型。
    • 确保所有函数都有原型 - 如果是 static 函数,则在源文件中,如果要由其他目标文件使用,则在头文件中。
    • 使用 Mehrdad 和 Brian R. Bondy 建议的任一结构,确保每个源文件的所有头文件只能包含一次

    【讨论】:

      【解决方案3】:

      您可能包含两次头文件。确保您的头文件被#ifndef 语句包围。

      http://www.fredosaurus.com/notes-cpp/preprocessor/ifdef.html

      【讨论】:

        【解决方案4】:

        同样的事情发生在我身上,这是因为我不小心包含了 .c/.cpp 文件(在其中)而不是头文件。

        那肯定会让你犯很多错误。

        【讨论】:

          猜你喜欢
          • 2018-04-27
          • 2010-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多