与这篇文章有些相似,但仍然不同:我可以在某个头文件中定义全局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;
^~~~
有没有办法在源文件中定义全局自动变量和 将其包含在某个头文件中?还是我必须放弃这个梦想并找到它的类型?
有没有办法在源文件中定义全局自动变量并将其包含在某个头文件中?
如果不进行初始化auto
则无法声明变量。使用auto
,类型是从初始化器推导出来的。如果没有初始化器,编译器就无法知道类型。编译器需要知道类型是什么。
如果您在标题中使用推导的类型,那么技术上允许以下内容(根据另一个答案中链接的 SO 帖子(,尽管它主要违背了使用auto
的目的:
// header
extern int a;
// cpp
auto a = 5;
但不幸的是,在实践中,一些编译器不喜欢这样。
作为一种可行的替代方案,您可以简单地使用内联变量:
// header
inline auto a = 5;
在C++17之前,你需要放弃auto
的梦想,以获得外部变量。
根据 C++ 17 标准(10.1.7.4 自动说明符(
3 使用 auto 或 decltype(auto( 声明的变量的类型为 从其初始值设定项推导。在初始化中允许使用此用法 变量的声明 (11.6( ...
Si 这样的用法说明符自动
extern auto a;
无效。
你必须写
auto a = 5;
//...
extern int a;
这是一个演示程序
#include <iostream>
auto a = 5;
int main()
{
extern int a;
std::cout << "a = " << a << 'n';
}
考虑到以这种方式在标头中定义变量是一个坏主意。从 17 C++开始,你可以写
inline auto a = 5;