zoukankan      html  css  js  c++  java
  • 关于重复定义 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库等。当出现重复定义时,可以将提示出错的库放在另一个库前边。可以的话不只使用其中一个库。

  • 相关阅读:
    聪明人 & 普通人
    13种模型及方法论
    面向大规模商业系统的数据库设计和实践
    分治算法
    软件架构
    隐含前提思维模型
    Git回滚代码到某个commit
    使用arthas排查 test 问题
    Arthas
    docker 操作入门
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/12161653.html
Copyright © 2011-2022 走看看