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

在这里插入图片描述

文章目录

  • 1.c++文件后缀
  • 2.c++编译
  • 3.c++头文件
  • 4.c++如何调用c库(重点)
  • 5.将c生成动态库
  • 6.编译程序
  • 7.命名空间 作用域运算符::
  • 8.命名空间定义
  • 9.命名空间成员引用
  • 10.命名空间嵌套
  • 11.命名空间使用方式
  • 12.匿名空间

1.c++文件后缀

  .cpp     .h    .hpp      .cc    .cxx  

2.c++编译

g++ hello.cpp -o hello

3.c++头文件

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

#include 
#include 

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

extern "C"
{
    #include 
    #include 
    #include "myhead.h"
}

例子:

5.将c生成动态库

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

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

extern "C"
{
    #include 
    #include 
    #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 

// 定义命名空间
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 
//using namespace std :执行这步,可写或不写std::
using namespace std;
//1\外部调用c语言的头库,便于区分
extern "C"
{
    #include 
    #include 
    #include 
}

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

在这里插入图片描述

你可能感兴趣的:(C++软件工程师课程,c++,c语言,开发语言)