回调函数(callback)是什么?一文理解回调函数(callback)

110 篇文章 52 订阅
订阅专栏

一、什么是回调函数

1.1、回调函数的定义和基本概念

回调函数是一种特殊的函数,它作为参数传递给另一个函数,并在被调用函数执行完毕后被调用。回调函数通常用于事件处理、异步编程和处理各种操作系统和框架的API。

基本概念:

  1. 回调:指被传入到另一个函数的函数。
  2. 异步编程:指在代码执行时不会阻塞程序运行的方式。
  3. 事件驱动:指程序的执行是由外部事件触发而不是顺序执行的方式。

1.2、回调函数的作用和使用场景

回调函数是一种常见的编程技术,它可以在异步操作完成后调用一个预定义的函数来处理结果。回调函数通常用于处理事件、执行异步操作或响应用户输入等场景。

回调函数的作用是将代码逻辑分离出来,使得代码更加模块化和可维护。使用回调函数可以避免阻塞程序的运行,提高程序的性能和效率。另外,回调函数还可以实现代码的复用,因为它们可以被多个地方调用。

回调函数的使用场景包括:

  1. 事件处理:回调函数可以用于处理各种事件,例如鼠标点击、键盘输入、网络请求等。
  2. 异步操作:回调函数可以用于异步操作,例如读取文件、发送邮件、下载文件等。
  3. 数据处理:回调函数可以用于处理数据,例如对数组进行排序、过滤、映射等。
  4. 插件开发:回调函数可以用于开发插件,例如 WordPress 插件、jQuery 插件等。

回调函数是一种非常灵活和强大的编程技术,可以让我们更好地处理各种异步操作和事件。

二、回调函数的实现方法

回调函数可以通过函数指针或函数对象来实现。

2.1、函数指针

函数指针是一个变量,它存储了一个函数的地址。当将函数指针作为参数传递给另一个函数时,另一个函数就可以使用这个指针来调用该函数。函数指针的定义形式如下:

返回类型 (*函数指针名称)(参数列表)

例如,假设有一个回调函数需要接收两个整数参数并返回一个整数值,可以使用以下方式定义函数指针:

int (*callback)(int, int);

然后,可以将一个实际的函数指针赋值给它,例如:

int add(int a, int b) {
    return a + b;
}
callback = add;

现在,可以将这个函数指针传递给其他函数,使得其他函数可以使用这个指针来调用该函数。

2.2、函数对象/functor

除了函数指针,还可以使用函数对象来实现回调函数。函数对象是一个类的实例,其中重载了函数调用运算符 ()。当将一个函数对象作为参数传递给另一个函数时,另一个函数就可以使用这个对象来调用其重载的函数调用运算符。函数对象的定义形式如下:

class callback {
public:
    返回类型 operator()(参数列表) {
        // 函数体
    }
};

例如,假设有一个回调函数需要接收两个整数参数并返回一个整数值,可以使用以下方式定义函数对象:

class Add {
public:
    int operator()(int a, int b) {
        return a + b;
    }
};
Add add;

然后,可以将这个函数对象传递给其他函数,使得其他函数可以使用这个对象来调用其重载的函数调用运算符。

2.3、匿名函数/lambda表达式

回调函数的实现方法有多种,其中一种常见的方式是使用匿名函数/lambda表达式。

Lambda表达式是一个匿名函数,可以作为参数传递给其他函数或对象。在C++11之前,如果想要传递一个函数作为参数,需要使用函数指针或者函数对象。但是这些方法都比较繁琐,需要显式地定义函数或者类,并且代码可读性不高。使用Lambda表达式可以简化这个过程,使得代码更加简洁和易读。

下面是一个使用Lambda表达式实现回调函数的例子:

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

void forEach(const std::vector<int>& v, std::function<void(int)> func) {
    for (int i : v) {
        func(i);
    }
}

int main() {
    std::vector<int> v{1, 2, 3, 4, 5};
    forEach(v, [](int i){std::cout << i << " ";});
    std::cout << std::endl;
    return 0;
}

在上面的例子中,定义了一个forEach函数,接受一个vector和一个回调函数作为参数。回调函数的类型是void()(int),即一个接受一个整数参数并且返回void的函数指针。在main函数中使用了Lambda表达式来作为回调函数的实现,即[](int i){std::cout << i << " ";}。Lambda表达式的语法为{/ lambda body */},其中[]表示Lambda表达式的捕获列表,即可以在Lambda表达式中访问的外部变量;{}表示Lambda函数体,即Lambda表达式所要执行的代码块。

在使用forEach函数时,我们传递了一个Lambda表达式作为回调函数,用于输出vector中的每个元素。当forEach函数调用回调函数时,实际上是调用Lambda表达式来处理vector中的每个元素。这种方式相比传递函数指针或者函数对象更加简洁和易读。

使用Lambda表达式可以方便地实现回调函数,使得代码更加简洁和易读。但是需要注意Lambda表达式可能会影响代码的性能,因此需要根据具体情况进行评估和选择。

三、回调函数的应用举例

异步编程中的回调函数:网络编程中,当某个连接收到数据后,可以使用回调函数来处理数据。

例如:

void onDataReceived(int socket, char* data, int size);

int main() {
  int socket = connectToServer();
  startReceivingData(socket, onDataReceived);
  // ...
}

void onDataReceived(int socket, char* data, int size) {
  // 处理数据...
}

回调函数在GUI编程中的应用:GUI编程中,当用户触发了某个操作时,可以使用回调函数来处理该操作。

例如:

void onButtonClicked(Button* button);

int main() {
  Button* button = createButton("Click me");
  setButtonClickHandler(button, onButtonClicked);
  // ...
}

void onButtonClicked(Button* button) {
  // 处理按钮点击事件...
}

事件处理程序中的回调函数:多线程编程中,当某个线程完成了一次任务后,可以使用回调函数来通知主线程。

例如:

void onTaskCompleted(int taskId);

int main() {
  for (int i = 0; i < numTasks; i++) {
    startBackgroundTask(i, onTaskCompleted);
  }
  // ...
}

void onTaskCompleted(int taskId) {
  // 处理任务完成事件...
}

四、回调函数的优缺点

优点:

  • 提高代码的复用性和灵活性:回调函数可以将一个函数作为参数传递给另一个函数,从而实现模块化编程,提高代码的复用性和灵活性。
  • 解耦合:回调函数可以将不同模块之间的关系解耦,使得代码更易于维护和扩展。
  • 可以异步执行:回调函数可以在异步操作完成后被执行,这样避免了阻塞线程,提高应用程序的效率。

缺点:

  • 回调函数嵌套过多会导致代码难以维护:如果回调函数嵌套层数过多,代码会变得非常复杂,难以维护。
  • 回调函数容易造成竞态条件:如果回调函数中有共享资源访问,容易出现竞态条件,导致程序出错。
  • 代码可读性差:回调函数的使用可能会破坏代码的结构和可读性,尤其是在处理大量数据时。

小结:代码灵活、易于扩展,但是不易于阅读、容易出错。

五、回调函数与其他编程概念的关系

5.1、回调函数和闭包的关系

回调函数和闭包之间存在着紧密的关系。回调函数是一个函数,在另一个函数中被作为参数传递,并在该函数执行完后被调用。闭包是由一个函数及其相关的引用环境组合而成的实体,可以访问函数外部的变量。

在某些情况下,回调函数需要访问到它所在的父函数的变量,这时就需要使用闭包来实现。通过将回调函数放在闭包内部,可以将父函数的变量保存在闭包的引用环境中,使得回调函数能够访问到这些变量。同时,闭包还可以保证父函数中的变量在回调函数执行时不会被销毁,从而确保了回调函数的正确性。

因此,回调函数和闭包是一对密切相关的概念,常常一起使用来实现复杂的逻辑和功能。

5.2、回调函数和Promise的关系

C++回调函数和Promise都是异步编程的实现方式。

回调函数是一种将函数作为参数传递给另一个函数,在异步操作完成后执行的技术。在C++中,回调函数通常使用函数指针或函数对象来实现。当异步操作完成后,会调用注册的回调函数,以便执行相应的处理逻辑。

而Promise则是一种更加高级的异步编程模式,它通过解决回调地狱问题,提供了更加优雅和简洁的异步编程方式。Promise可以将异步操作封装成一个Promise对象,并通过链式调用then()方法来注册回调函数,以及catch()方法来捕获异常。当异步操作完成后,Promise会自动根据操作结果触发相应的回调函数。

因此,可以说C++回调函数和Promise都是异步编程的实现方式,但是Promise提供了更加高级和优雅的编程模式,能够更好地管理异步操作和避免回调地狱问题。

5.3、回调函数和观察者模式的关系

回调函数和观察者模式都是用于实现事件驱动编程的技术。它们之间的关系是,观察者模式是一种设计模式,它通过定义一种一对多的依赖关系,使得一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。而回调函数则是一种编程技术,它允许将一个函数作为参数传递给另一个函数,在执行过程中调用这个函数来完成特定的任务。

在观察者模式中,当一个被观察的对象发生改变时,会遍历所有的观察者对象,调用其定义好的更新方法,以进行相应的操作。这里的更新方法就可以看做是回调函数,因为它是由被观察对象调用的,并且在执行过程中可能需要使用到一些外部参数或上下文信息。因此,可以说观察者模式本身就包含了回调函数的概念,并且借助回调函数来实现观察者模式的具体功能。

六、如何编写高质量的回调函数

回调函数需要遵循以下几个原则:

  1. 明确函数的目的和作用域。回调函数应该有一个清晰的目的,同时只关注与其作用范围相关的任务。
  2. 确定回调函数的参数和返回值。在定义回调函数时,需要明确它所需的参数和返回值类型,这样可以使调用方更容易使用。
  3. 谨慎处理错误和异常。回调函数可能会引发一些异常或错误,需要使用 try-catch 块来处理它们,并给出相应的警告。
  4. 确保回调函数不会导致死锁或阻塞。回调函数需要尽可能快地执行完毕,以避免影响程序的性能和稳定性。
  5. 使用清晰且易于理解的命名规则。回调函数的命名应该清晰、简洁,并尽可能说明其功能和意义。
  6. 编写文档和示例代码。良好的文档和示例代码可以帮助其他开发者更容易地使用回调函数,同时也有助于提高代码的可维护性和可重用性。
  7. 遵循编码规范和最佳实践。 编写高质量的回调函数需要遵守编码规范和最佳实践,例如使用合适的命名规则、注释代码等。

6.1、回调函数的命名规范

回调函数的命名规范没有固定的标准,但是根据通用惯例和编码规范,回调函数的命名应该能够反映函数的作用和功能,让其他开发者能够快速理解并使用。

  1. 使用动词+名词的方式来描述回调函数的作用,例如onSuccess、onError等。
  2. 如果回调函数是用于处理事件的,可以以handleEvent或者onEvent作为函数名。
  3. 如果回调函数是用于处理异步操作完成后的结果,可以以onComplete或者onResult作为函数名。
  4. 在命名时要注意保持简洁明了,不要过于冗长,也不要使用缩写或者不清晰的缩写。
  5. 尽量使用有意义的单词或者短语作为函数名,不要使用无意义的字母或数字组合。
  6. 与代码中其他的函数名称保持一致,尽量避免出现命名冲突的情况。

6.2、回调函数的参数设计

回调函数的参数设计取决于回调函数所需执行的操作和数据。一般来说,回调函数需要接收至少一个参数,通常是处理结果或错误信息。其他可选参数根据需要添加。

例如,如果回调函数是用于处理异步请求的,则第一个参数可能是错误信息(如果存在),第二个参数则是请求返回的数据。另外,也可以将回调函数的上下文传递给该函数作为参数,以便在回调函数中使用。

假设有一个函数 process_data 用于处理数据,但是具体的处理方式需要根据不同的情况进行定制化。这时候我们可以使用回调函数来实现。

回调函数的参数设计如下:

void process_data(void *data, int len, void (*callback)(void *result));

其中,data 表示要处理的数据,len 表示数据的长度,callback 是一个函数指针,用于指定处理完数据后的回调函数。回调函数的形式如下:

void callback_func(void *result);

在 process_data 函数中,首先会对数据进行处理,然后将处理结果传递给回调函数进行处理。具体实现如下:

void process_data(void *data, int len, void (*callback)(void *result)) {
    // 处理数据
    void *result = data; // 这里只是举个例子,实际上需要根据实际情况进行处理

    // 调用回调函数
    callback(result);
}

使用示例:

#include <stdio.h>

void callback_func(void *result) {
    printf("processing result: %s\n", (char *)result); // 这里只是举个例子,实际上需要根据实际情况进行处理
}

int main() {
    char data[] = "hello world";
    process_data(data, sizeof(data), callback_func);
    return 0;
}

七、总结

回调函数是一种常见的编程模式,主要内容包括以下几个方面:

  • 回调函数的定义:回调函数是一个作为参数传递给其他函数的函数,它能够被异步调用以处理某些事件或完成某些任务。
  • 回调函数的使用场景:回调函数通常用于异步编程中,例如在浏览器端的 AJAX 请求、Node.js 中的文件读写等场景中都会使用回调函数。
  • 回调函数的实现方式:回调函数可以通过直接传入函数名或者通过匿名函数的方式来实现。
  • 回调函数的错误处理:在回调函数中,需要对可能出现的错误进行处理,例如返回错误对象、抛出异常或通过回调函数传递错误信息等方式。
  • 回调函数的优缺点:回调函数可以提高代码的灵活性和可重用性,但也容易导致代码复杂度增加、嵌套过深等问题。

在这里插入图片描述

回调函数(CallBack)
gzrjzcx的博客
11-21 1349
首先声明,回调函数并不是一种特殊的函数结构,而指的是利用函数指针来回调写好的函数的一种使用方法。 1.回调函数是什么其具体实现是使用者自己定义一个函数,并且使用者自己实现这个函数的程序内容,然后将自己的函数作为参数传入别人的函数中,由别人的系统函数在运行时调用。简单地说也就是—-由别人的函数运行期间来回调你实现的函数。别人并不关心你的函数的具体实现,只知道在什么时候调用你的函数;而你知道你的函数的
什么是回调函数
freedom0203的专栏
04-16 3462
 什么是回调函数?  简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。 为什么要使用回调函数?  因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。   如果
秒懂函数回调机制,回调函数看这篇就够了
热门推荐
tiandiren111的专栏
05-16 1万+
什么是回调函数 友情提示:原理介绍部分摘自:https://www.jianshu.com/p/2f695d6fd64f有一定基础的直接跳过即可,直接查看后面精彩部分...回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数回调函数不是由该函数的实现方直接调用,而是在特定的...
回调函数是什么,为什么要有回调函数?有什么优缺点?回调的本质是什么?
最新发布
weixin_47151388的博客
09-05 950
回调函数是用于将函数作为参数传递给其他函数的一种机制,主要应用于异步编程和事件驱动编程。它可以提高代码的解耦性和灵活性,但也可能增加代码的复杂性。回调的本质是通过函数指针或可调用对象实现的控制反转,使得调用者能够在某些特定时机控制函数的执行。
回调函数,同步回调与异步回调
weixin_36204895的博客
08-07 1427
首先,在一个头文件中定义回调函数的类型。这个类型通常是一个函数指针类型,指向具有特定签名(即参数和返回类型)的函数。Callback.h// 定义回调函数类型// 一个外部函数,用于注册和调用回调函数public:private:现在,你可以在另一个源文件中定义一个或多个符合CallbackFunc签名的函数。Main.cpp// 回调函数实现// 注册回调函数// 调用doSomething,它将触发回调函数return 0;
回调函数理解
ColourfulTiger的博客
12-22 1346
        在做项目中,我们会写很多独立的函数,尤其是在javascript中,会有很多的function,但是这些都是独立的个体,只能执行对应的片段功能,但是在实际情况下,很多东西都不是各自独立为营的。        在javascript中,回调是以callback的形式展示的。        1、回调是什么?        拿舞蹈为例,如果你想看舞蹈,你看到的肯定是很多动作,但你不...
一文看懂什么是回调函数
十年饮冰,难凉热血,保持热爱,奔赴星海!
07-17 6222
回调函数是一种在编程中常见的概念,它是指一个函数作为参数传递给另一个函数,并且在特定事件发生或条件满足时被调用执行的函数。
回调函数
UUUUTaossienUUUU的专栏
05-21 787
什么是回调函数? 我们绕点远路来回答这个问题。 编程分为两类:系统编程(system programming)和应用编程(application programming)。所谓系统编程,简单来说,就是编写库;而应用编程就是利用写好的各种库来编写具某种功用的程序,也就是应用。系统程序员会给自己写的库留下一些接口,即API(application programming interface
回调函数 到底是什么
小黄宝宝的专栏
02-23 438
编程分为两类:系统编程(system programming)和应用编程(application programming)。所谓系统编程,简单来说,就是编写库;而应用编程就是利用写好的各种库来编写具某种功用的程序,也就是应用。系统程序员会给自己写的库留下一些接口,即API(application programming interface,应用编程接口),以供应用程序员使用。所以在抽象层的图示里,库
什么是回调函数
清风彬的博客
04-12 7204
回调就是一种利用函数指针进行函数调用的过程。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数
java调用c 回调函数_一文搞懂C语言回调函数
weixin_35197188的博客
02-26 392
什么是回调函数我们先来看看百度百科是如何定义回调函数的:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。这段话比较长,也比较绕口。下面我通过一幅图来说明什么是回调:假设我们要使用一个...
C/C++ - 回调函数的实现
Hsy的博客
11-04 1146
文章目录函数指针C++虚函数bink & function参考鸣谢 项目中有时候能遇到一些回调函数,于是思考其实现方法,顺便找了一下其他实现方法,简单总结一下: 函数指针 关于函数指针,有趣的是: Why do function pointer definitions work with any number of ampersands ‘&’ or asterisks ‘*’? 下面直接看 demo,这里模拟的是外部 lib 及使用的的使用方法: //CallBack 1 /******
一文通俗带过回调函数
weixin_38289027的博客
09-10 310
1回调函数定义 回调函数就是一个通过函数指针调用的函数。即是把函数指针作为参数传入另外一个函数,当这个指针被用来调用其所指向的函数时,该函数就是回调函数。 定义:
回调机制(callback)在编程设计模式中的使用,一文即开窍!
i493052739的博客
04-26 981
什么是回调(callback)机制? 它不限于Java,而是通用的编程机制。 回调的三个阶段: 声明回调:我发了一个帖子,说我后续会继续更新 注册回调:楼下网友订阅了我的帖子等更新 触发回调:我更新了,调用当初的声明回调代码,来通知所有订阅(注册回调)的网友 回调在设计模式中的使用: 策略模式 模板模式 观察者模式 访问者模式 此外: 事件总线 监听器 过滤器 某功能预留的客制化前置后置处理 对接口实现类的调用(创建接口=声明回调;实现接口=注册回调;调用实现类=触发回调) 故此推理:代理也是回
Callback Hell】一文让你轻松了解何为回调地狱?
Milk~每天分享一点点,技术进步一点点
08-12 858
回调地狱【Callback Hell】 前提知识点: 单线程和异步: JS是单线程语言,只能同时做一件事儿 (例子:做一个ajax请求去加载资源,或者说弄一个定时器,先等待1秒钟后干嘛,如果按照单线程这个只能同时做一件事儿,那么它在这个事情中,它就卡住了,卡住的话鼠标点不了,js不执行。这就是同时做一件事,这就是js单线程的本质。) 浏览器和node.js已支持JS启动进程,如Web Worker Js和DOM渲染共用同一个线程,因为JS可修改DOM结构 一、 遇到等待(网络请求,定时任务)不能卡住 二
回调函数CALLBACK)学习总结
04-02 1万+
回调函数应该和设计相关而不是和语言相关。在分层设计中,高层次的模块会叫低层次的模块做一些事情,通常是通过函数调用。 从设计上来说,低层次的模块不应该直接调用高层次模块的函数。所以高层次模块在叫低层模块做事的时候会注册一个回调函数给低层模块,然后低层模块做完了就调用这个函数。表现在C语言上是个函数指针调用(calling)机制从汇编时代起已经大量使用:准备一段现成的代码,调用者可以随时跳
回调函数的基本使用
malloc不出对象的博客
12-22 2359
本文主要介绍了回调函数的基本使用以及详细介绍了qsort函数的细节使用。
异步消息的传递-回调机制
smilingleo的专栏
10-21 2150
陈家朋 (japen@vip.sina.com)2004 年 2 月1 什么是回调软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务
python syslog.syslog
11-30
Python的syslog模块提供了一个简单的接口来将日志消息发送到系统日志服务,例如rsyslog。使用syslog模块,可以将日志消息发送到本地系统日志服务或远程日志服务器。以下是一个简单的示例,演示如何使用syslog模块将日志消息发送到本地系统日志服务: ```python import syslog # 打开系统日志 syslog.openlog(ident='myapp', logoption=syslog.LOG_PID, facility=syslog.LOG_LOCAL0) # 发送日志消息 syslog.syslog(syslog.LOG_INFO, 'This is a test message') # 关闭系统日志 syslog.closelog() ``` 在上面的示例中,我们首先使用openlog()函数打开系统日志,并指定了一个标识符(ident)、日志选项(logoption)和设施(facility)。然后,我们使用syslog()函数将日志消息发送到系统日志服务。最后,我们使用closelog()函数关闭系统日志。
写文章

热门文章

  • 回调函数(callback)是什么?一文理解回调函数(callback) 46389
  • 学习C++的第一步,环境搭建:Visual Studio的安装和创建C++项目 19558
  • C++文件流:通过ofstream和ifstream轻松实现文件读写 16659
  • 超级用户指南:轻松升级你的Ubuntu Linux内核版本 15953
  • 轻松设置CentOS IP地址的最终指南:详细的分步说明 14237

分类专栏

  • Linux后台开发技术 36篇
  • C/C++技术干货 110篇
  • C++从零开始到精通 49篇
  • stressapptest源码剖析 6篇
  • 软件设计 1篇
  • Linux内核分析 10篇
  • 半导体技术 2篇
  • Go语言开发 1篇
  • SQL Server 17篇
  • 面经 2篇
  • 开源框架 6篇
  • DPDK 5篇
  • skynet 4篇
  • Linux工程管理 10篇
  • Lua编程 5篇
  • 云原生 31篇
  • 图床项目 13篇
  • 开源项目 3篇
  • Linux中间件
  • Kafka 9篇
  • Nginx 8篇
  • MySQL 15篇
  • Redis 12篇
  • 数据结构与算法 28篇
  • Linux基础组件 19篇
  • Linux网络设计 27篇
  • 运维 35篇
  • python 8篇

最新评论

  • 一文了解GPU并行计算CUDA

    strivehigher: 博主写的很清晰,期待多多更新

  • CPU性能监控:从理解CPU上下文切换开始

    爱编程的喵喵: 优质好文,博主的文章细节很到位,兼顾实用性和可操作性,感谢博主的分享,期待博主持续带来更多好文

  • 2025年起,退休年龄逐步延迟,看看你何时退休!

    爱编程的喵喵: 优质好文,博主的文章细节很到位,兼顾实用性和可操作性,感谢博主的分享,期待博主持续带来更多好文

  • 深入 awk 命令:Linux 命令行中的文本处理神器

    爱编程的喵喵: 优质好文,博主的文章细节很到位,兼顾实用性和可操作性,感谢博主的分享,期待博主持续带来更多好文

  • 深入理解 C 语言流缓冲:setlinebuf,setbuffer,setbuf,setvbuf 解析

    爱编程的喵喵: 优质好文,博主的文章细节很到位,兼顾实用性和可操作性,感谢博主的分享,期待博主持续带来更多好文

最新文章

  • CPU性能监控:从理解CPU上下文切换开始
  • 2025年起,退休年龄逐步延迟,看看你何时退休!
  • CPU性能监控:平均负载和CPU使用率
2024
09月 7篇
08月 14篇
07月 4篇
06月 5篇
05月 17篇
04月 26篇
03月 12篇
02月 5篇
01月 26篇
2023年208篇
2022年124篇
2021年1篇
2019年3篇
2018年3篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lion Long

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

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

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

打赏作者

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

抵扣说明:

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

余额充值

玻璃钢生产厂家沁阳玻璃钢雕塑价格玻璃钢雕塑处理方法上饶玻璃钢花盆舟山玻璃钢广场雕塑厂家三门峡玻璃钢景观雕塑制作厂家玻璃钢雕塑盘龙柱制作廉江玻璃钢户外造型雕塑价格玻璃钢发光雕塑灯带钦州玻璃钢雕塑定制衢州景区玻璃钢雕塑广东商业商场美陈销售企业玻璃钢雕塑找瑞鑫阳玻璃钢山东商业商场美陈供货商开阳玻璃钢雕塑制作哈尔滨玻璃钢可爱雕塑无锡玻璃钢鹿雕塑价格广宁玻璃钢造型雕塑汕尾人物玻璃钢雕塑湖北环保玻璃钢雕塑定制荆门广场玻璃钢雕塑开江玻璃钢雕塑菏泽太湖石校园玻璃钢景观雕塑绍兴动物玻璃钢雕塑定做价格玻璃钢宝剑雕塑宿迁玻璃钢人物雕塑加工价格景区玻璃钢卡通雕塑设计标志玻璃钢雕塑重不重山西高质量玻璃钢雕塑图片图木舒克广场玻璃钢雕塑玻璃钢幼儿园装饰雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化