【问题标题】:Can global auto variables be declared in h files? [duplicate]全局自动变量可以在 h 文件中声明吗? [复制]
【发布时间】:2019-09-05 12:25:47
【问题描述】:

有点类似于this post,但仍然不同:我可以在某个头文件中定义一个全局auto 变量吗?我尝试使用以下文件,但无法编译。

$ cat main.cpp
auto a = 5;
#include "defs.h"
int main(int argc, char **argv){ return a; }
$ cat defs.h
#ifndef __DEFS_H__
#define __DEFS_H__
extern auto a;
#endif

在标准编译后(g++ main.cpp -o main)出现以下错误:

In file included from main.cpp:2:0:
defs.h:3:8: error: declaration of ‘auto a’ has no initializer
 extern auto a;
        ^~~~

有没有办法在源文件中定义一个全局自动变量和 将其包含在某些头文件中?还是我必须放弃这个梦想并找到它的类型?

【问题讨论】:

  • #define __DEFS_H__ 这是一个保留的标识符。通过定义它,您的程序将具有未定义的行为。选择另一个宏。
  • 不相关,但诸如 __DEFS_H__ 之类的名称在 C++(和 C)中是保留的 - 您不应该在自己的代码中创建它们。
  • 刚刚注意到您在问题中引用了重复项,声称您的问题不同 - 您的问题有何不同?
  • 这是不可能的;每个使用该变量的翻译单元都必须推断出相同的类型,甚至没有任何方法可以验证它们是否做到了。

标签: c++ global-variables header-files auto


【解决方案1】:

有没有办法在源文件中定义一个全局自动变量并将其包含在某个头文件中?

你不能在没有初始化的情况下声明auto 变量。使用auto,类型是从初始化程序推导出来的。没有初始化器,编译器就无法知道类型。编译器需要知道类型是什么。

如果您改为在标头中使用推导类型,则在技术上允许以下操作(根据另一个答案中链接的 SO 帖子),尽管它主要违背了使用 auto 的目的:

// header
extern int a;

// cpp
auto a = 5;

但不幸的是,在实践中,一些编译器不喜欢这样。

作为一种可行的替代方法,您可以简单地使用内联变量:

// header
inline auto a = 5;

C++17 之前,你需要放弃 auto 的梦想来获取外部变量。

【讨论】:

    【解决方案2】:

    根据 C++ 17 标准(10.1.7.4 自动说明符)

    3 使用 auto 或 decltype(auto) 声明的变量的类型是 从它的初始化器推导出来。 允许在初始化时使用 变量的声明 (11.6)。..

    Si这样的说明符auto的用法

    extern auto a;
    

    无效。

    你必须写

    auto a = 5;
    
    //...
    
    extern int a;
    

    这是一个演示程序

    #include <iostream>
    
    auto a = 5;
    
    int main() 
    {
        extern int a;
    
        std::cout << "a = " << a << '\n';
    }
    

    考虑到以这种方式在标头中定义变量是一个坏主意。从 C++ 17 开始,您可以编写

    inline auto a = 5;
    

    【讨论】:

      猜你喜欢
      • 2020-03-01
      • 2018-04-04
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多