C++教程之autokeyword的使用
一、autokeyword的前世
从C语言開始,autokeyword就被当作是一个变量的存储类型修饰符,表示自己主动变量(局部变量)。它不能被单独使用,否则编译器会给出警告。
#include <stdio.h>
int main()
{
int a = 123;
auto int b = 234;
auto c = 345;
printf("a = %d, b = %d, c = %d\n", a, b, c);
return 0;
}
编译执行结果:
$ gcc main.c
main.c:7:7: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
auto c = 345;
~~~~ ^
1 warning generated.
$ ./a.out
a = 123, b = 234, c = 345
二、autokeyword的今生
在C++ 11标准中,加入了新的类型推导特性,考虑到autokeyword非常少使用,就给它又一次赋予了功能——申明类型由编译器推导的变量。
在C++
11中。使用auto定义的变量不能使用其他类型修饰符修饰,该变量的类型由编译器依据初始化数据自己主动确定。auto类型的变量必须进行初始化。
#include <iostream>
int main()
{
int a = 21;
auto b = a;
//typeid能够获取变量或者数据类型的名字
std::cout << typeid(b).name() << std::endl;
return 0;
}
1 .使用C++ 98标准进行编译,会出现警告:
$ clang++ main.cpp -std=c++98
main.cpp:6:2: warning: 'auto' type specifier is a C++11 extension
[-Wc++11-extensions]
auto b = a;
^
1 warning generated.
$ ./a.out
i #输出结果为整数类型
改用C++ 11进行编译:
$ clang++ main.cpp -std=c++11
$ ./a.out
i
2 .可是假设还是将auto作为存储类型修饰符使用,则在C++
11标准下会出现警告:
#include <iostream>
int main()
{
int a = 21;
auto int b = a;
//typeid能够获取变量或者数据类型的名字
std::cout << typeid(b).name() << std::endl;
return 0;
}
使用C++ 98编译:
$ clang++ main.cpp -std=c++98
$ ./a.out
i
改用C++ 11编译,出现警告,不再同意作为存储类型修饰符使用:
$ clang++ main.cpp -std=c++11
main.cpp:6:2: warning: 'auto' storage class specifier is not permitted in C++11,
and will not be supported in future releases [-Wauto-storage-class]
auto int b;
^~~~~
1 warning generated.
3 .必需要对auto类型的变量进行初始化,C++
98中不能单独使用auto定义变量。
$ clang++ main.cpp -std=c++98
main.cpp:6:2: warning: 'auto' type specifier is a C++11 extension
[-Wc++11-extensions]
auto b;
^
main.cpp:6:7: error: declaration of variable 'b' with type 'auto' requires an
initializer
auto b;
^
1 warning and 1 error generated.
$ clang++ main.cpp
main.cpp:6:2: warning: 'auto' type specifier is a C++11 extension
[-Wc++11-extensions]
auto b;
^
main.cpp:6:7: error: declaration of variable 'b' with type 'auto' requires an
initializer
auto b;
^
1 warning and 1 error generated.
三、扩展
在C++中还能使用decltype来获取变量或者表达式的类型并用来定义新的变量。
#include <iostream>
int main()
{
int a = 21;
decltype(a) b;
std::cout << typeid(b).name() << std::endl;
return 0;
}
编译执行结果:
$ clang++ main.cpp -std=c++98
$ ./a.out
i
$ clang++ main.cpp -std=c++11
$ ./a.out
i
须要注意的是该标准仅仅是改变了C++中auto的使用方法。可是并没有影响auto在C语言中的使用!
本文档由长沙戴维营教育整理。
C++教程之autokeyword的使用的更多相关文章
- [转]搬瓦工教程之九:通过Net-Speeder为搬瓦工提升网速
搬瓦工教程之九:通过Net-Speeder为搬瓦工提升网速 有的同学反映自己的搬瓦工速度慢,丢包率高.这其实和你的网络服务提供商有关.据我所知一部分上海电信的同学就有这种问题.那么碰到了坑爹的网络服务 ...
- jQuery EasyUI教程之datagrid应用(三)
今天继续之前的整理,上篇整理了datagrid的数据显示及其分页功能 获取数据库数据显示在datagrid中:jQuery EasyUI教程之datagrid应用(一) datagrid实现分页功能: ...
- jQuery EasyUI教程之datagrid应用(二)
上次写到了让数据库数据在网页datagrid显示,我们只是单纯的实现了显示,仔细看的话显示的信息并没有达到我们理想的效果,这里我们丰富一下: 上次显示的结果是这样的 点击查看上篇:jQuery Eas ...
- jQuery EasyUI教程之datagrid应用(一)
最近一段时间都在做人事系统的项目,主要用到了EasyUI,数据库操作,然后抽点时间整理一下EasyUI的内容. 这里我们就以一个简洁的电话簿软件为基础,具体地说一下datagrid应用吧 datagr ...
- kali linux 系列教程之metasploit 连接postgresql可能遇见的问题
kali linux 系列教程之metasploit 连接postgresql可能遇见的问题 文/玄魂 目录 kali linux 下metasploit 连接postgresql可能遇见的问题. ...
- kali Linux系列教程之BeFF安装与集成Metasploit
kali Linux系列教程之BeFF安装与集成Metasploit 文/玄魂 kali Linux系列教程之BeFF安装与集成Metasploit 1.1 apt-get安装方式 1.2 启动 1. ...
- Kali Linux系列教程之OpenVas安装
Kali Linux系列教程之OpenVas安装 文 /玄魂 目录 Kali Linux系列教程之OpenVas安装 前言 1. 服务器层组件 2.客户层组件 安装过程 Initial setup ...
- Playmaker Input篇教程之PlayMaker菜单概述
Playmaker Input篇教程之PlayMaker菜单概述 Playmaker InputPlayMaker菜单概述 Playmaker插件被导入游戏项目以后,会自动为Unity编辑器添加一个名 ...
- Playmaker Input篇教程之Playmaker购买下载和导入
Playmaker Input篇教程之Playmaker购买下载和导入 Playmaker Input篇认识Playmaker Playmaker是Unity的插件,其标志如图1-1所示.开发者使用它 ...
随机推荐
- Xcode修改个性化注释
1.首先找到Xcode进入包内容 2.依次进入/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Develo ...
- Spring知识整理
Spring简介 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,用来管理和维护bean,其中的特点是IOC(控制反转) DI(依赖注入) AOP(面向切面) 容易和其他框 ...
- day3--远程链接Linux
互联网上的计算机,都会有一个唯一的32位的地址,IP地址 我们访问服务器,就必须通过这个IP地址 局域网里也有预留的IP地址,192/10/172开头.局域网的IP地址也是唯一的. NAT模式,电脑宿 ...
- WebService-axis2
WebService框架有好多,常用的cxf,axis2等,axis2的配置过程相对简单,不用编写接口,在实现.只需要一个Service服务类即可.配置过程大致如下: 1,导入jar包(这里我是把ax ...
- CentOS6.8系统下,ecipse下进行编辑操作,意外退出
错误情况:centos下打开eclipse软件,点击*.java或者*.pom软件卡死,命令行终端报错误信息,稍后eclipse自动退出. 错误信息: Java: cairo-misc.c:380: ...
- php 文档操作
ftp_mkdir() 函数在 FTP 服务器上建立新目录. 语法 ftp_mkdir(ftp_connection,dir) 参数 描述 ftp_connection 必需.规定要使用的 FTP 连 ...
- HtmlImageGenerator乱码问题解决、html2image放linux上乱码问题解决
使用html2image-0.9.jar生成图片. 在本地window系统正常,放到服务器linux系统时候中文乱码问题.英文可以,中文乱码应该就是字体问题了. 一.首先需要在linux安装字体,si ...
- Vue学习笔记-Vue基础入门
此篇文章是本人在学习Vue是做的部分笔记的一个整理,内容不是很全面,希望能对阅读文章的同学有点帮助. 什么是Vue? Vue.js (读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式 ...
- vimgdb安装
vimgdb install ************** a) You need: vim-7.3.tar.bz2 http://www.vim.org/sources.php vimgdb- (t ...
- Entity Framework——常见报错总结
1 实体属性配置为IsRequired()对更新的影响 抛出异常类型DbEntityValidationException 表结构: 实体: public class User { public in ...