游戏开发之extern “C“、内存申请及匿名函数(lambda)(C++基础)

135 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

游戏开发之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…)