Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么要在头文件中声明的变量中使用extern?_C++ - Fatal编程技术网

C++ 为什么要在头文件中声明的变量中使用extern?

C++ 为什么要在头文件中声明的变量中使用extern?,c++,C++,在Visual Studio编译中经常收到LNK2005错误后,我正在深入研究C++头文件,并意识到错误在于我在头文件和main.cpp中声明了两次变量,我还发现一些用户给出了如何使用外部类型变量_name的解决方案;在头文件中作为解决方案,阅读答案,我想到了3个问题: 1st-您真的需要使用extern来声明头文件中任何类型的变量吗?如果是这样,为什么不在头文件中声明类时使用它呢 2nd-在头文件中使用extern是否是一种良好的做法?还是有更好的方法可以使用,而不会给我上面收到的错误 3rd

在Visual Studio编译中经常收到
LNK2005
错误后,我正在深入研究C++头文件,并意识到错误在于我在头文件和main.cpp中声明了两次变量,我还发现一些用户给出了如何使用
外部类型变量_name
的解决方案;在头文件中作为解决方案,阅读答案,我想到了3个问题:

1st-您真的需要使用
extern
来声明头文件中任何类型的变量吗?如果是这样,为什么不在头文件中声明类时使用它呢

2nd-在头文件中使用
extern
是否是一种良好的做法?还是有更好的方法可以使用,而不会给我上面收到的错误

3rd-据我所知,使用
extern
需要在.cpp文件中重新声明变量,但如果它已经在头文件中声明,为什么不能在.cpp中设置它的值

PS:以下是我深入研究头文件并在此处生成此问题的原因:

toast_notification.h:

#pragma once

bool dollar_value_was_changed;
bool toast_notification_was_created;

void show_toast_notification(), create_and_initialize_toast_notification(), set_toast_notification();
bool is_windows_10();
toast_notification.cpp:

#include "toast_notification.h"

#include <Windows.h>
#include <VersionHelpers.h>
#include <wintoast/wintoastlib.h>

void show_toast_notification()
{
    if (is_windows_10())
    {
        if (!toast_notification_was_created)
            create_and_initialize_toast_notification();
    }
}

bool is_windows_10()
{
    if (IsWindows10OrGreater())
        return true;
    else
    {
        MessageBox(NULL, L"Teste", L"Título da janela?", MB_OK);

        return false;
    }
}

void create_and_initialize_toast_notification()
{
    WinToastLib::WinToast::instance()->setAppName(L"Toast Dollar");
    WinToastLib::WinToast::instance()->setAppUserModelId(WinToastLib::WinToast::configureAUMI(L"Teste", L"Toast Dollar"));
    WinToastLib::WinToast::instance()->initialize();

    toast_notification_was_created = true;
}

void set_toast_notification()
{
    WinToastLib::WinToastTemplate toast_notification = WinToastLib::WinToastTemplate(WinToastLib::WinToastTemplate::Text02);
    toast_notification.setTextField(L"Teste", WinToastLib::WinToastTemplate::FirstLine);
}

在C++中,命名空间范围内的变量声明是定义,除非声明为“代码> ExtNe< /Calp>”。
extern
阻止声明成为定义。在一个程序中只能定义一次变量(除非将其设置为内联)。由于标题通常包含在多个翻译单元中,因此您会得到多个定义


注意:我不建议将变量
内联
inline
“变量”定义主要用于
constexpr
对象。一般来说,我建议在C++中,不使用非代码> const <代码>全局数据。< /p> < p>在命名空间范围内的变量声明是一个定义,除非它声明为“代码> ExtNe< /Calp>”。
extern
阻止声明成为定义。在一个程序中只能定义一次变量(除非将其设置为内联)。由于标题通常包含在多个翻译单元中,因此您会得到多个定义


注意:我不建议将变量
内联
inline
“变量”定义主要用于
constexpr
对象。一般来说,我建议不要使用非
常量
全局数据。

为什么要在头文件中声明的变量中使用extern?避免在多个源文件中使用头文件时提供多个定义。更好的问题是,为什么您认为需要在头文件中声明变量?通常全局变量不是答案,远远不是。@underline\u我同意。这是一个我从来没有遇到过的问题,因为我几乎从来没有在头文件中定义过变量。您缺少一个很好的区别,即为什么要在头文件中声明的变量中使用extern?避免在多个源文件中使用头文件时提供多个定义。更好的问题是,为什么您认为需要在头文件中声明变量?通常全局变量不是答案,远远不是。@underline\u我同意。这是一个我从未遇到过的问题,因为我几乎从未在标题中定义过变量
#include "toast_notification.h"

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
    
    show_toast_notification();

    system("pause");
}
1> toast_notification.obj: error LNK2005: "bool dollar_value_was_changed" (?dollar_value_was_changed @@ 3_NA) already defined in main.obj
1> toast_notification.obj: error LNK2005: "bool toast_notification_was_created" (?doast_notification_was_created @@ 3_NA) already defined in main.obj```