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

  • 相关阅读:
    线性代数回顾+深化(未完成版)
    HIT OS2020 Spring Lab2
    选择
    工业互联网
    leetcode-200 岛屿数量
    记网易面试题<二>
    记网易面试题《一》
    leetecode-14-最长公共子串-简单
    leetcode-1012 至少有1位重复的数字
    协程
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/12161653.html
Copyright © 2011-2022 走看看