当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

C++基础:C++中的类型重定义

    这几天工作时碰到一个C++的编译错误(我使用的是Visual C++ 7.0),说是有一个类重复定义,仔细想想我们的这个项目也是做了好几个Release了, 内部代码应该不会有这样的低级错误, 真把类型给重复定义了,检查结果正如我预料的一样。 就这样, 我左右没找到原因,被一个编译错误给卡在那里了。(在我的概念中, 程序错误的等级为:编译错误->链接错误->逻辑错误, 此错误属于最低级 )。这时我仔细看了一下错误提示, 发现重复定义是由于从两个不同的路径包含了同一个头文件而引起的,同事也建议从另外一个路径打开工程试试, 这才慢慢发现了原因。这个原因可能有些拗口,而事实上要出现这种错误也有些“曲折“, 让我从不同情况下的类型重定义来解释一下吧。 

    我总结的C++中类型重定义情况有三。
 
    1 没有在文件头加#pragma once指示符。

    Type1.h:  #pragma once的作用是保证本文件只被编译一次,如果没有在Type1.h中加这句话,那么在main.cpp里面包含了两次Type1.h, 就相当于在main.cpp里面定义了两次Type类, 自然就是类型重定义了。

 //#pragma once

class Type

{  

};

Main.cpp:

#include \"Type1.h\"

#include \"Type1.h\"

int main(int argc, char *argv[])

{

   return 1;

}


    2 两个不同的头文件中定义了相同的类型(均有#pragma once)

 Type1.h:Type2.h:Main.cpp:

#pragma once

class Type

{

};

 
#pragma once

class Type

{     

};


    这里main.cpp中同时包含了Type1.h, Type2.h两个头文件, 虽然其文件头都有#pragma once,但因为是不同的文件, 预编译器还是会两次把Type类的定义放在Main.cpp中, 所以也会出现了重定义。

 #include \"Type1.h\"

#include \"Type2.h\"

int main(int argc, char *argv[])

{

   return 1;

}


    3 从两个不同的路径包含了同一个头文件

    前面两种是比较常见, 也是比较容易解决的情况, 而这里要讲的第三种情况, 比较少见, 而且一般出现在有虚拟映射盘的时候。(这样才能做到从两个不同的路径包含同一个头文件), 其他会在什么时候出现, 我还没想到, 知道的朋友顶一下:)。下面我来分析一下:
 
    1) 有VC工程在D:\\Test目录下。
 
    2) 映射虚拟盘X为D:\\Test.
 
    不熟悉的网友可以按此操作: 开始->运行->在运行窗口输入:cmd->在cmd窗口输入:
 
    Subst X: D:\\Test->回车。
 
    3) 该工程有文件Type1.h, main.cpp

 Type1.h:

#pragma once

class Type

{

};

Main.cpp:

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接