.cpp .h .hpp .cc .cxx
g++ hello.cpp -o hello
一般没有.h,基本上是将c语言的头文件前面加一个c例如
#include
#include
extern "C"
{
#include
#include
#include "myhead.h"
}
例子:
gcc add.c -fPIC -shared -o libadd.so
2.将c函数声明添加到头文件 myhead.h
3.再main.cpp使用c语言头文件
extern "C"
{
#include
#include
#include "myhead.h"
}
g++ main.c libadd.so -o main
练习 : 自己编译c动态库,c++调用
//---------------------------------------
因为c++库接口是非常丰富的,如果自己命名的函数或者全局变量与库中的函数冲突了
这样编译器就会不知道调用哪个函数,所以为了解决此问题,c++引入了命名空间这个概念
namespace 空间名
{
除了main函数外的所有函数,变量类型
}
注意命名空间空间一般放在头文件或者全局区域
dmeo:
// 创建命名空间
namespace class01
{
char name[100] = "jack";
int age = 18;
}
//----------------------------------
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);
//-----------------------------------
namespace AAA
{
namespace BBB
{
int number = 10;
}
int data = 20;
}
namespace AAA
{
int number = 30;
}
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);
//-----------------------------------
相当于全局变量,但是只能在本文使用
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;
}