首页 > 解决方案 > 全局自动变量可以在 h 文件中声明吗?

问题描述

有点类似于这篇文章,但仍然不同:我可以在某个头文件中定义一个全局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;
        ^~~~

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

标签: c++global-variablesheader-filesauto

解决方案


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

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

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

// header
extern int a;

// cpp
auto a = 5;

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

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

// header
inline auto a = 5;

在 C++17 之前,您需要放弃auto外部变量的梦想。


推荐阅读