• 关于重复定义 LNK2005


    有时候会见到同事写的代码中,头文件一打开就有如下格式:

    #ifndef  ...

    #define  ...

    ...//正文

    #endif

    当时看不出有什么意义,于是也就不明白为什么这么写了,就这样让它做为一个高端的存在放在记忆里

    今天它从神坛上掉了下来:

    原来它是意义仅仅是替换 #pragma once,然而头文件中都包含此句 -_-” OMG

    这样可以避免头文件被重复包含,并被重复编译,于是也可以避免头文件中可能存在的全局变量被重复定义。

    以下几种情形与全局变量重复定义有关:

    1.因为全局变量是针对整个工程的,正确的:在一个CPP文件中定义,eg. int g_Test;在另一个要使用的CPP中声明:extern int g_Test。

    但是如果还是 int g_Test就会LNK2005了。

    划重点,C++标准的规定,变量是声明必须满足以下两个条件,否则就是定义:

    (1)声明必须使用extern关键字;

    (2)不能给变量赋初值;

    所以

    int a; int a = 0; extern int a =0;  是定义

    extern int a;  是声明

    2.当头文件中声明了全局变量时,必段使用#pragma once 来避免重复定义,也可以使用上边提到的宏定议方式

    3.当使用第三方库出现重定义时,例如MFC库与C运行库,以及MFC与ATL库等。当出现重复定义时,可以将提示出错的库放在另一个库前边。可以的话不只使用其中一个库。

  • 相关阅读:
    NYOJ The Triangle
    max()和数组里面的max
    sizeof和strlen的区别和联系总结
    继BAT之后 第四大巨头是谁
    专注做好一件事
    编程技术面试的五大要点
    IBM面试记
    创业者,你为什么这么着急?
    硅谷创业教父Paul Graham:如何获得创业idea
    17家中国初创公司的失败史
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/12161653.html
Copyright © 2020-2023  润新知