本文已参与「新人创作礼」活动,一起开启掘金创作之路。
游戏开发之extern "C"、内存申请及匿名函数(lambda)(C++基础)
一、extern "C"
语法:extern "C" [函数导出约定] [其余描述] 返回值数据类型 函数名();
- 在函数前面添加,将C++风格的函数,编译为C风格。注意:若有函数重载就会无效。
- _declspec(dllexport) 的作用是导出函数给其他库使用(仅在windows生效)。
extern "C" {
_declspec(dllexport) void func1() { std::cout << "He12312312" << std::endl; }
}
extern "C" void func10(){}
extern "C" _declspec(dllexport) void func11();
void func11()
{
}
二、与C相比内存申请方式不同
- 在C中使用malloc free 申请和释放内存。
- 在C++ 中 使用new delete申请和释放内存。
- 在C++ 中 申请数组是 new 数据类型[长度] 释放数组是delete[] 变量名;
- 注意 如果是new的数组则必须使用delete数组的形式释放,否则会出现问题。
int *p = new int;
delete p;
p = NULL;
int *pp = new int[100];
delete[] pp;
三、匿名函数或lambda
没有函数名的函数,C++11特性。
语法: [外部引用参数](参数列表)[->返回的数据类型] { 函数体 } 外部引用参数: &: 以引用方式获取所有当前作用域内的变量,需要注意声明周期 =: 以拷贝方式获取外部变量 变量名: 以拷贝方式获取作用域内的变量名 变量名1,变量名2,... &变量名: 以引用方式捕获一个变量 &变量名1,&变量名2,...
实例:
void Sort1(std::function<int(void*, void*)> f)
{
f(NULL, NULL);
}
int main()
{
int a = 100;
获取lambda函数的第一种方式
//auto 自动推导数据类
//它是根据右值推导数据类型
//并且必须要有右值
auto f = [&]()
{
printf("hello world!\n");
a = 300;
};
f();
printf("%d\n", a);
auto f1 = [=]()
{
printf("hello world %d\n", a);
};
f1();
auto f2 = [a, &p]()
{
printf("hello world %d %x\n", a, &p);
};
f2();
auto f3 = [a, &p](int m)->int
{
printf("hello world %d %d\n", a, m);
return 100;
};
printf("%d=====\n", f3(1000));
获取lambda函数的第二种方式
// 需要引用头文件 functional
// std::function<函数的声明的返回值(函数形参)> 它是一个数据类型
std::function<int(int)> f5 = [a, &p](int m)->int
{
printf("hello world!%d %d\n", a, m);
return 100;
};
printf("%d=====\n", f5(1000));
std::function<int(void *, void*)> f6 = [](void *p1, void *p2)->int
{
return *(int*)p1 > *(int*)p2;
};
Sort1(f6);
return 0;
}
版权声明:本文为CSDN博主「ufgnix0802」的原创文章:
原文链接:(blog.csdn.net/qq135595696…)