c++ - 全局自动变量可以在 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;
^~~~
有没有办法在源文件中定义全局自动变量并将其包含在某个头文件中?还是我必须放弃这个梦想并找到它的类型?
解决方案
有没有办法在源文件中定义全局自动变量并将其包含在某个头文件中?
你不能在auto
没有初始化的情况下声明变量。使用auto
,类型是从初始化程序推导出来的。没有初始化器,编译器就无法知道类型。编译器需要知道类型是什么。
如果您改为在标头中使用推导类型,则在技术上允许以下操作(根据另一个答案中链接的 SO 帖子),尽管它主要违背了使用的目的auto
:
// header
extern int a;
// cpp
auto a = 5;
但不幸的是,在实践中,一些编译器不喜欢这样。
作为一种可行的替代方法,您可以简单地使用内联变量:
// header
inline auto a = 5;
在 C++17 之前,您需要放弃auto
外部变量的梦想。
推荐阅读
- javascript - 在 Javascript 中展平对象数组的快速方法
- python - 数据框和数组之间的点积上的 TypeError
- haskell - 将带有两个参数的过滤器函数应用于由 Haskell 中带有一个参数的函数生成的列表
- javascript - 在一年的最后几天修复 Date.getWeek() 函数错误?
- c - 如何更改进程的进程组ID
- php - “购买”后尝试从网页中删除项目,但仍显示在用户购买项目历史记录中
- javascript - Javascript 承诺:监控数组的状态
- reactjs - React Hooks 结合 Firebase 数据未在页面加载时显示
- python - 如何使用 argparse 指定最小或最大浮点值
- swift - 即使我有睡眠线程,可可应用程序退出代码也不会执行