C++头文件动态库函数封装+命名空间

在这里插入图片描述

1.c++文件后缀

  .cpp     .h    .hpp      .cc    .cxx  

2.c++编译

g++ hello.cpp -o hello

3.c++头文件

一般没有.h,基本上是将c语言的头文件前面加一个c例如

#include <cstdio>
#include <iostream>

4.c++如何调用c库(重点)

extern "C"
{
    #include <stdio.h>
    #include <stdlib.h>
    #include "myhead.h"
}

例子:

5.将c生成动态库

gcc add.c -fPIC -shared -o libadd.so

2.将c函数声明添加到头文件 myhead.h
3.再main.cpp使用c语言头文件

extern "C"
{
    #include <stdio.h>
    #include <stdlib.h>
    #include "myhead.h"
}

6.编译程序

g++ main.c libadd.so -o main

练习 : 自己编译c动态库,c++调用
//---------------------------------------

7.命名空间 作用域运算符::

因为c++库接口是非常丰富的,如果自己命名的函数或者全局变量与库中的函数冲突了
这样编译器就会不知道调用哪个函数,所以为了解决此问题,c++引入了命名空间这个概念

8.命名空间定义

namespace 空间名
{
   除了main函数外的所有函数,变量类型
}
注意命名空间空间一般放在头文件或者全局区域

dmeo:

// 创建命名空间
namespace class01
{
    char name[100] = "jack";
    int age = 18;
}
//----------------------------------

9.命名空间成员引用

1.直接通过命名空间::成员(建议使用)

   class01::name

2.using指示符引用成员

   using namespace class01;
   demo 
   // using 将class01暴露在此文件中
   // 相当于name在此文件任意位置随意使用,命名空间不起效果
   // 千万不要在头文件暴露命名空间,否则会导致空间污染
   using namespace class01;
   printf("name = %s\n",name);

3.using指定暴露空间中的哪个成员

// 将空间里面的age进行暴露在本文件
using class01::age;     
printf("age = %d\n",age); 
//-----------------------------------

10.命名空间嵌套

namespace AAA
{
   namespace BBB
   {
       int number = 10;
   }
   int data = 20;
}
namespace AAA
{
   int number = 30;
}

11.命名空间使用方式

1.直接使用

   printf("%d\n",AAA::BBB::number);
   printf("%d\n",AAA::data);
   printf("%d\n",AAA::number);

2.using 指引使用

   using namespace AAA::BBB;
   printf("%d\n",number);

3.using 指定成员引用

  using namespace AAA::BBB::number;
   printf("%d\n",number);
//-----------------------------------

12.匿名空间

相当于全局变量,但是只能在本文使用

namespace
{
   int data;
}
//data 只能在本文件使用,其他文件不能使用
//-----------------------------------

练习:

设计两个命名空间class01,class02,空间中的成员有名字,年龄和编号
把空间名里面的成员(变量)个人信息,并且通过输入初始化信息,同时输出 class01,class02里面的成员信息

demo:

//-----------------------------------
#include <cstdio>

// 定义命名空间
namespace class01
{
    char name[100] = "jack";
    int age = 18;
    int number = 123;
}

namespace class02
{
    char name[100] = "rose";
    int age = 19;
    int number = 456;
}

int main()
{
    scanf("%s%d%d",class01::name,&class01::age,&class01::number);
    scanf("%s%d%d",class02::name,&class02::age,&class02::number);

    printf("class01::name : %s,class01::age : %d,class01::number : %d\n", \
            class01::name, class01::age, class01::number );

    printf("class02::name : %s,class02::age : %d,class02::number : %d\n", \
            class02::name, class02::age, class02::number );

    return 0;
}
#include <iostream>
//using namespace std :执行这步,可写或不写std::
using namespace std;
//1\外部调用c语言的头库,便于区分
extern "C"
{
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
}

制作c语言动态库指令

//gcc call.c -fPIC -shared -o libcall.so

//namespace:命名空间成员引用
namespace class_name
{
    char name[10]="jack";
    int age=18;
}

//直接通过命名空间::成员(建议使用)
//class_name::name
//:: 就像一个箭头(->)指向成功名
//class_name:就像普通指针、结构体指针或结构体变量

//using namespace class_name;
//using:指示符引用成员,将class_name暴露在文件中
//printf("%d",name)

2\命名空间的嵌套(打印必须AAA::BBB::"num)

namespace   AAA
{
    namespace BBB
    {
        int num =10;
    }
    int cc=12;
}
namespace AAA
{
    int num=11;  //不会覆盖
}

练习

namespace class01
{
    char name[20];
    short age;
    unsigned ID;
}
namespace class02
{
    char name[20];
    short age;
    unsigned ID;
}

3 匿名空间

//相当于全局变量(static),其他文件不可见,只在当前有效
//data 只能在本文件使用,其他文件不能使用
namespace
{
    int data=100l;
}

4 输入输出c++

int main(void)
{   
    printf("给class01的name;age;ID赋值\n");
    scanf("%s",class01::name);
    scanf("%hd",&class01::age);
    scanf("%u",&class01::ID);

    printf("给class02的name;age;ID赋值\n");
    scanf("%s",class02::name);
    scanf("%hd",&class02::age);
    scanf("%u",&class02::ID);
    
    std::cout<<"打印结果"<<"\n";
    std::cout<<"\033[32m01::name=\033[0m"<<class01::name<<"\n";
    std::cout<<"\033[33m01::age=\033[0m"<<class01::age<<"\n";
    std::cout<<"\033[34;1m01::ID=\033[0m"<<class01::ID<<"\n";

    std::cout<<"02::name="<<class02::name<<"\n";
    std::cout<<"02::age="<<class02::age<<"\n";
    std::cout<<"02::ID="<<class02::ID<<"\n";

    std::cout<<"name="<<class_name::name<<"\n";
    std::cout<<"age="<<class_name::age<<"\n";

    std::cout<<"AAA->BBB:num="<<AAA::BBB::num<<"\n";
    std::cout<<"AAA:cc="<<AAA::cc<<"\n";
    std::cout<<"AAA:num="<<AAA::num<<"\n";
   
    
    cout<<"匿名空间值="<<data<<endl; //100

    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: bits/stdc++.h 是一个非标准的 C++ 文件,它包含了所有标准文件,可以方便地使用各种 STL(标准模板)的函数和数据结构。但是,由于它不是标准文件,因此在一些编译器中可能无法使用。建议在编写代码时,使用标准的文件,如 #include <iostream>、#include <vector> 等。 ### 回答2: bits/stdc++.h 是一个常用的C++文件,它包含了大部分标准及一些常用的第三方。它的设计初衷是方便使用者快速编写代码,减少复杂的文件引入。但它并不属于标准,只是由一些C++编译器和IDE供应商提供,因此并非所有编译器和IDE都支持该文件。 bits/stdc++.h 的引入可以代替包括 iostream、cstdio、cstdlib、cstring、cmath 等标准文件,以及 algorithm、vector、queue、stack、set 等STL相关文件的引入,省略了大量文件的编写。这样的做法虽然方便,但会导致编译时间变长,因为编译器需要解析整个文件,而不是只解析需要的。因此在一些需要优化的场合,建议使用具体的文件,以减少编译时间。 在使用 bits/stdc++.h 的时候,需要特别注意命名空间。因为该文件引入了大量的标准和STL,在调用函数时不加命名空间,容易造成命名冲突。所以,使用该文件的程序需要加上特定的命名空间,如 std::cout、std::vector 等。 总之,bits/stdc++.h 无疑给 C++ 编程带来了一定的方便,但在实际使用的时候需要注意其不足之处,如编译时间长、命名空间冲突等问题。对于不支持该文件的编译器或需要优化编译时间的情况,还是建议使用具体的文件。 ### 回答3: bits/stdc++.h是一个常见的C++文件,它实际上包含了所有的标准C++文件。从技术上讲,这个文件不是标准的C++文件,而是GCC编译器的文件。GCC是一种常用的编译器,它被广泛地用于编译C++程序。 该文件包含了来自标准的所有文件,包括iostream、string、vector等等,使得程序员无需一个一个地包含这些文件就能够使用它们定义的函数和类。因此,bits/stdc++.h快速地成为了C++程序员之间的共识,方便快捷。 使用bits/stdc++.h时需要注意,若要以可移植的方式编写代码,最好只使用那些标准所定义的文件,尤其是在大型项目中。如果仅在简单的程序中使用bits/stdc++.h是可以的,但对于复杂的场景,合理包含需要的文件并遵循构建工具的指导,则更为可行。 总之,bits/stdc++.h这个文件虽然不是标准C++文件,但它提供了一种方便的方式来包含常用的文件,加快了C++编程过程中的速度,是C++程序员常用的工具之一,但在实际应用中还是需要适量的使用和注意。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qt历险记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值