C++ c执行-命名空间-输入输出

编译及运行c++程序

C++ 和C语言类似,也要经过编译和链接后才能运行。VS、Dev C++、VC 6.0、Code::Blocks、C-Free、GCC、Xcode 等常见 IDE 或编译器,它们除了可以运行C语言程序,还可以运行 C++ 程序,步骤是一样的。

> C/C++ 代码生成可执行文件的过程:参考文献:(https://blog.csdn.net/weibo1230123/article/details/82781284)

Linux-G++ 命令:

使用gcc命令可以在命令行便捷操作c++的程序,这里采用linux gcc的基本语法简单介绍。

gcc 与 g++ 分别是 gnu 的 c & c++ 编译器 gcc/g++ 在执行编译工作的时候,总共需要4步:

  • 1、预处理,生成 .i 的文件[预处理器cpp]

  • 2、将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs]

  • 3、有汇编变为目标代码(机器代码)生成 .o 的文件[汇编器as]

  • 4、连接目标代码, 生成可执行程序 [链接器ld]

使用gcc命令来编译和链接C程序。例如编译单个源文件:

gcc main.c

编译多个源文件:

gcc main.c module.c

编译C++程序时,gcc命令也可以使用,不过要增加**-lstdc++**选项,否则会发生链接错误。例如编译单个源文件:

gcc main.cpp -lstdc++

编译多个C++源文件:

gcc main.cpp module.cpp -lstdc++

gcc命令在链接时默认使用C的库,只有添加了-lstdc++选项才会使用 C++ 的库。不过 GCC 中还有一个g++命令,它专门用来编译 C++ 程序,广大 C++ 开发人员也都使用这个命令。g++命令和gcc命令的用法如出一辙,例如编译单个源文件:

g++ main.cpp

参数表

参数 执行效果
-c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
-S 只激活预处理和编译,就是指把文件编译成为汇编代码。
-E 只激活预处理,这个不生成文件, 你需要把它重定向到一个输出文件里面。
-o 制定目标名称, 默认的时候, gcc 编译出来的文件是 a.out
-pipe 使用管道代替编译中临时文件, 在使用非 gnu 汇编工具的时候, 可能有些问题。

更多参数参见:https://www.runoob.com/w3cnote/gcc-parameter-detail.html

C++ 命名空间

C++应用程序中可能正在编写一些具有名为x()函数的代码,并且还有另一个可用的库,它也具有相同的x()函数。现在编译器无法知道代码中引用的x()函数的哪个版本。名称空间(namespace)被设计来克服这个困难,并被用作额外的信息来区分类似的函数、类、变量等等,它们在不同的库中具有相同的名称。可以定义定义名称的上下文。本质上,名称空间定义了一个范围。

namespace定义

在C语言中只有一个全局作用域:

C语言中所有的全局标识符共享一个作用域 标识符之间可能发生冲突

C++中提出了命名空间的概念:

1.命名空间将全局作用域分成不同的部分,
2.不同命名空间中的标识符可以同名而不会发生冲突 3.命名空间可以发生嵌套
4.全局作用域也叫默认命名空间

语法如下:

namespace Name{ namespace Internal  {       /*...*/ }   /*...*/}// name是命名空间的名字,它里面可以包含变量、函数、类、typedef、#define 等,最后由一对{}包围。

举个栗子:

小郭与

而解决方法则是定义一个命名空间:

namespace guo{  //小郭    FILE aaa = NULL;}namespace jia{  //小嘉    FILE aaa = NULL;}

使用namespace

使用namespace时需要使用双冒号这个新的符号:::,称为域解析操作符,在C++中用来指明要使用的命名空间。

如上述例子:

guo::aaa = fopen("a.txt", "r");  //使用小guo定义的变量jia::aaa = fopen("b.txt", "rb+");  //使用小jia定义的变量

除了直接使用域解析操作符,还可以采用using 关键字声明,例如:

using guo::aaaaaa = fopen("a.txt", "r");  //使用小guo定义的变量jia::aaa = fopen("b.txt", "rb+");  //使用小jia定义的变量

其意思就是先抢占一个优先使用的命名空间,也可以使用using namespace guo对该命名空间整个定义。

命名空间内部不仅可以声明或定义变量,对于其它能在命名空间以外声明或定义的名称,同样也都能在命名空间内部进行声明或定义,例如类、函数、typedef、#define 等都可以出现在命名空间中。站在编译和链接的角度,代码中出现的变量名、函数名、类名等都是一种符号(Symbol)。有的符号可以指代一个内存位置,例如变量名、函数名;有的符号仅仅是一个新的名称,例如 typedef 定义的类型别名。

如下例子:

#include //将类定义在命名空间中namespace one{    class Student{    public:        char *name;        int age;    public:        void say(){            printf("%s的虚假年龄是 %d\n", name, age);        }    };};namespace two{    class Student{    public:        char *name;        int age;    public:        void say(){            printf("%s的真实年龄是 %d\n", name, age+20);        }    };}int main(){    one::Student stu1;  char* name1 = (char*)"guojia";    stu1.name = name1;    stu1.age = 2;    stu1.say();  two::Student stu2;  char* name2 = (char*)"guojia";    stu2.name = name2;    stu2.age = 2;    stu2.say();    return 0;}

std 命名空间及头文件

因为早期的 C++ 还不完善,不支持命名空间,没有自己的编译器,而是将 C++ 代码翻译成C代码,再通过C编译器完成编译。这个时候的 C++ 仍然在使用C语言的库,stdio.h、stdlib.h、string.h 等头文件依然有效;此外 C++ 也开发了一些新的库,增加了自己的头文件,例如:

  • iostream.h:用于控制台输入输出头文件。

  • fstream.h:用于文件操作的头文件。

  • complex.h:用于复数计算的头文件。

和C语言一样,C++ 头文件仍然以.h为后缀,它们所包含的类、函数、宏等都是全局范围的。后来 C++ 引入了命名空间的概念,计划重新编写库,将类、函数、宏等都统一纳入一个命名空间,这个命名空间的名字就是std。std 是 standard 的缩写,意思是“标准命名空间”。

但是这时已经有很多用老式 C++ 开发的程序了,它们的代码中并没有使用命名空间,直接修改原来的库会带来一个很严重的后果:程序员会因为不愿花费大量时间修改老式代码而极力反抗,拒绝使用新标准的 C++ 代码。

C++ 开发人员想了一个好办法,保留原来的库和头文件,它们在 C++ 中可以继续使用,然后再把原来的库复制一份,在此基础上稍加修改,把类、函数、宏等纳入命名空间 std 下,就成了新版 C++ 标准库。这样共存在了两份功能相似的库,使用了老式 C++ 的程序可以继续使用原来的库,新开发的程序可以使用新版的 C++ 库。

为了避免头文件重名,新版 C++ 库也对头文件的命名做了调整,去掉了后缀.h,所以老式 C++ 的iostream.h变成了iostreamfstream.h变成了fstream。而对于原来C语言的头文件,也采用同样的方法,但在每个名字前还要添加一个c字母,所以C语言的stdio.h变成了cstdiostdlib.h变成了cstdlib

对于原来C语言的头文件,即使按照 C++ 的方式来使用,即#include 这种形式,那么符号可以位于命名空间 std 中,也可以位于全局范围中。

使用命名空间 std:

#include int main(){    std::printf("guojia");    return 0;}

不使用命名空间 std:

#include int main(){    printf("郭嘉");    return 0;}

正常情况下这两种写法都可以使用,但是出现一些函数的冲突的时候,编译将失效。在 Microsoft Visual C++ 和 GCC 下都能够编译通过,也就是说,大部分编译器在实现时并没有严格遵循C++标准,它们对两种写法都支持,可以使用 std 也可以不使用。

一般情况下使用c++头文件会更灵活

输入输出

C中,通常会使用 scanf 和 printf 来对数据进行输入输出操作。在C++语言中,C语言的这一套输入输出库我们仍然能使用,但是 C++ 又增加了一套新的、更容易使用的输入输出库.

cin为c++获取键盘的函数,cout为c++输出的语句。

如下:

#includeusing namespace std;int main( ){   char name[50];   cout << "请输入您的名称:";   cin >> name;   cout << "您的名称是:" << name << endl;}

注意的是,cout 和 cin 都是 C++ 的内置对象,而不是关键字。C++ 库定义了大量的类(Class),程序员可以使用它们来创建对象,cout 和 cin 就分别是 ostream 和 istream 类的对象,只不过它们是由标准库的开发者提前创建好的,可以直接拿来使用。这种在 C++ 中提前创建好的对象称为内置对象。

使用 cout 进行输出时需要紧跟<<运算符,使用 cin 进行输入时需要紧跟>>运算符,这两个运算符可以自行分析所处理的数据类型,因此无需像使用 scanf 和 printf 那样给出格式控制字符串。

连续输入

#includeusing namespace std;int main(){    char x[50];    float y;    cout<<"你的名字和年龄分别是:"<<endl;    cin>>x>>y;    cout<<"你的名字是"<endl;    cout<<"你的年龄是"<endl;    return 0;}

使用编辑器 dev cpp 5.11

图 | 郭嘉

文 | 郭嘉

扫码关注桔梗与少年

微信号 : if-u-remembers

新浪微博:桔梗与少年

c++ namespace_c++语法2、c执行命名空间输入输出相关推荐

  1. C++ C++基础语法入门总结(一)命名空间-输入输出-缺省参数-函数重载

    C++基础语法入门总结 C++ 命名空间 如何定义和使用命名空间 C++ 输入与输出 C++ 缺省参数 C++函数重载 名字修饰 extern "c" 推荐阅读 C++ 命名空间 ...

  2. (P9)awk:什么是awk,awk简单用法,awk脚本语法,awk执行过程

    文章目录 1.什么是awk 2.awk简单用法 3.awk脚本语法 4.awk执行过程 1.什么是awk awk 是什么 awk 是一种用于处理数据和生成报告的编程语言 awk 可以在命令行中进行一些 ...

  3. select语句的语法顺序和执行顺序

    目录 1.语法顺序 2.执行顺序 3.优化方法 1.join 方面 2.where 方面 1.语法顺序 select语句的语法格式如下. select 字段列表 from 数据源 [ where条件表 ...

  4. DataQL之语法-万能查询执行步骤

    万能查询执行步骤 引用包 <dependency><groupId>net.hasor</groupId><artifactId>hasor-dataq ...

  5. python输入输出姓名_python学习笔记-执行与输入输出

    有同学问,能不能像.exe 文件那样直接运行.py文件呢?在 Windows 上是不行的,但是,在 Mac 和 Linux 上是可以的,方法是在.py文件的第一行加上一个特殊的注释: #!/usr/b ...

  6. 2.3Python基础语法(三)之输入输出

    返回总目录 目录: 1.input输入 2.print输出 (一)input输入 1.input的处理方式 # 输入input string = input("请输入一个字符串:" ...

  7. js二维数组arr中表示读取第i行第j列的是:_c++ c语言 数组与字符串

    c语法7 - 数组与字符串 概述 定义:把具有相同类型的若干变量按有序形式组织起来称为数组. C语言数组属于构造数据类型.一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型.因 ...

  8. XML概述、语法及常用操作

    1. XML概述 关于XML的定义有以下几种说法: ① XML是可扩展标记语言(Extensible Markup Language)的缩写. ② XML是一种类似于HTML的标记语言. ③ XML是 ...

  9. PHP 命名空间(namespace)

    2019独角兽企业重金招聘Python工程师标准>>> PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Ja ...

最新文章

  1. 熟悉交换机与路由器组网(图解)
  2. 网站添加到IIS和附件进程调试(新手使用篇)
  3. 防止程序多开的两种方法
  4. 信息系统项目管理师-招投标法、政府采购法核心知识点思维脑图
  5. 中国船级社船舶设计审核云平台
  6. 时间序列与R语言应用(part5)--移动平均MA模型及其可逆性
  7. C++ Makefile文件详解
  8. ajax respon有数据,Ajax怎么通过response在后台传递数据?(附代码)
  9. 初学者入门知识图谱必看的能力:推理
  10. Java Swing Mysql学生信息管理系统
  11. 运行gedit报No protocol specified
  12. HashMap在Jdk1.7和1.8中的实现
  13. es和oracle,Oracle和Elasticsearch数据同步
  14. hdoj 3376,2686 Matrix Again 【最小费用最大流】
  15. scrum 11.6
  16. 【报错】android.database.sqlite.SQLiteException: no such column: id (code 1): , while compiling: select
  17. Nginx 轻松搞定跨域问题!
  18. DDOS硬件防火墙DIY技术揭密
  19. android11怎么降级真我,安卓11怎么降回安卓10?安卓11降回安卓10相关操作步骤
  20. 对量子态和运算的一些基础认识

热门文章

  1. php mysql 服务器成本_php – 从mysql服务器访问和存储大量数据
  2. Think in Java第四版 读书笔记7第13章 字符串
  3. 2021-07-12 原来我用的是CPU,更改方法
  4. python以追加方式打开文件 线程安全吗_多线程追加文件,不加锁,会出现什么情况 ?...
  5. 酷安电脑版_2020年末 平板电脑购买推荐
  6. ios找不到信任证书_iOS 11 中可用的受信任根证书列表
  7. 应用优化前心路历程~
  8. idea如何自制插件_Lice IntelliJ插件图标制作过程
  9. 类写了package java命令出错_java/javac命令行如何同时引用多个包;错误 TypeError: 'JavaPackage' object is not callable 的含义...
  10. mysql currentuser_MySQL中DATABASE()和CURRENT_USER()函数的示例详解