bosthhe1 / cpushpush

0 stars 0 forks source link

头文件中声明不定义的一个原因 #51

Open bosthhe1 opened 1 year ago

bosthhe1 commented 1 year ago
当我们在头文件中声明+定义
#include<iostream>
using namespace std;
int Count = 10;
cpp1
#include"head.h"
int main()
{
    cout << Count << endl;
    return 0;
}
cpp2
#pragma once
#include"head.h"
class A
{
    //
};

在两个及其以上文件进行链接的时候,由于都包含了相同的头文件,编译的时候,会实例化出两个Count,所以链接的时候,Count重命名 image

bosthhe1 commented 1 year ago

这时候就想到用静态成员来解决这个问题

#include<iostream>
using namespace std;
static int Count = 10;
void func();//打印Count的地址
cpp1
#pragma once
#include"head.h"

void func()
{
    cout << &Count << endl;
}
cpp2
#include"head.h"
int main()
{
    func();
    cout << &Count << endl;
    return 0;
}

虽然程序不报错了,但是static的变量在不同的obj文件中存在不同的地址,说明存在两份statci变量 image

bosthhe1 commented 1 year ago

使用extern函数,是Count的作用域扩大

head.h
#include<iostream>
#include<windows.h>
#include<functional>
using namespace std;
extern int Count;
void func();
#pragma once
#include"head.h"
int Count = 10;//注意这里的声明的格式,和初始化不一样
void func()
{
    cout << &Count << endl;
}
cpp2
#include"head.h"
int main()
{
    func();
    cout << &Count << endl;
    cout << Count << endl;
    return 0;
}

image

bosthhe1 commented 1 year ago

extern函数是声明函数或者全局变量的作用范围的关键字,其声明的函数变量可以在本模块中和其他模块中使用