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

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)
c46f4437aaabb5a97ec276fa6124186c.png

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;}

520ae6f52eb049732f43fb249c6f0e5c.png

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;}

7ff029b038a84fef7dbcbf4b7e7d61c7.png

    注意的是,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;}

f30bf80d84792f028da99666a0828f25.png

使用编辑器 dev cpp 5.11

6d97e92eaccfed005c5b0be787836941.png

图 | 郭嘉

文 | 郭嘉

2957a829d57f84d7483d6ccbf59eeab8.png

扫码关注桔梗与少年

微信号 : if-u-remembers

新浪微博:桔梗与少年

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值