【问题标题】:visual C++ typdef struct multiple defined symbols problemsvisual C++ typedef struct 多重定义符号问题
【发布时间】:2011-09-07 07:48:38
【问题描述】:

在 Visual C++ 中,我遇到了“致命错误 LNK1169:找到一个或多个多重定义的符号”,下面的代码,如果我想在两个源中包含两个头文件以供其他函数使用,我该如何解决这个问题?

main.cpp
========
#include main.h
#include sub.h

sub.cpp
========
#include main.h
#include sub.h

sub.h
=========

typedef struct{
      char colour;
      char name;
}person;

person ssss = { red, ali};

【问题讨论】:

    标签: visual-c++ typedef


    【解决方案1】:

    你的问题是你在头文件中定义了一个变量:

    person ssss = { red, ali };
    

    一个在 main.cpp 中实例化,一个在 sub.cpp 中实例化。你最好写一个:

    extern person ssss;
    

    在头文件中,然后在其中一个源文件中定义一次变量。这将使两个源文件都知道它存在,并且两者都将引用同一个变量,假设这是您想要的。就像其他答案所建议的那样,我也肯定会建议使用 header guards,虽然您在此示例中并不特别需要它们,但这是一种很好的做法,从长远来看可以让您头疼。

    【讨论】:

      【解决方案2】:

      在两个源文件中都包含 typedef 应该不是问题。问题是 ssss 的声明通过 sub.h 出现在两个文件中。将其放入源文件之一并在标头中将其声明为外部以解决此问题。请注意,您有一个链接错误,而不是编译错误——这是因为在多个目标文件中找到了该符号。

      【讨论】:

        【解决方案3】:

        你应该在你的头文件中添加包含保护,以防止同一个头文件被多次包含。

        #ifndef SUB_H
        #define SUB_H
        
        
        //end of file
        #endif
        

        另外一件事,你为什么要在你的 sub.cpp 中包含 main.h?这似乎是错误的。

        【讨论】:

          【解决方案4】:

          在sub.h中,在文件顶部插入以下内容;

          #pragma once
          

          【讨论】:

            【解决方案5】:
            person ssss = { red, ali};
            

            sssssub.cppmain.cpp 中被实例化一次,因为sub.h 包含在任何一个文件中。实例化通常在源文件中而不是头文件中。现在,当您访问对象ssss 成员变量时,链接器无法访问哪个对象,因为它们都共享相同的范围。

            解决方案是拥有一个全局实例(如果这是您想要的),并且可以通过外部链接跨不同文件进行访问。

            main.cpp
            ========
            #include main.h       // What is main.h required for ?
            #include sub.h
            
            extern person ssss;
            
            sub.cpp
            ========
            #include main.h       //  ?!?!
            #include sub.h
            
            person ssss = { red, ali};
            
            sub.h
            =========
            
            typedef struct{
                  char colour;
                  char name;
            }person;
            

            【讨论】:

              猜你喜欢
              • 2010-12-13
              • 1970-01-01
              • 2012-06-17
              • 1970-01-01
              • 2021-03-21
              • 1970-01-01
              • 1970-01-01
              • 2022-09-25
              • 1970-01-01
              相关资源
              最近更新 更多