C/C++中函数调用规则(约定)__cdecl __stdcall __thiscall __vectorcall __fastcall __clrcall

Visual Studio调试技巧:查看C/C++函数调用栈 使用“调用堆栈”窗口可以查看当前堆栈上的函数或过程调用。 “调用堆栈”窗口显示每个函数的名称以及编写它所用的编程语言。 函数或过程名称可能包含可选信息,如模块名称、行号、参数名称、类型和值。 可以打开或关闭这些可选信息的显示。 一个黄色箭头标识执行指针当前所位于的堆栈帧。 默认情况下,该帧的信息显示在源、“反汇编”、“局部变量”、“监视”和“自动”窗口中。 如果想将上下文更改为堆栈上的另一个帧... 阅读详情

转自https://my.oschina.net/ray1421/blog/699540


相关文献

__stdcall
https://msdn.microsoft.com/en-us/library/zxk0tw93.aspx

C语言函数可变参数详解 - ranpanf的专栏 - 博客频道 - youkuaiyun.com
http://blog.youkuaiyun.com/ranpanf/article/details/4693130

关于c++变长参数列表总结 - zray4u的个人空间 -自己转载的另一篇文章
http://my.oschina.net/ray1421/blog/699538

注意平时我们所说的参数传递顺序和参数入栈顺序是一回事。

函数调用时,调用者首先把参数压入堆栈,然后调用子程序,在完成后,由于堆栈中先前压入的数不再有用,调用者或者被调用者必须有一方把堆栈指针恢复到调用前的状态。参数是最右边的先入堆栈还是最左边的先入堆栈、还有由调用者还是被调用者来修正堆栈都必须有个约定,不然就会产生不正确的结果。

https://yq.aliyun.com/articles/34353

_cdecl  这个名字起的难道是 C default calling的意思

__cdecl is the default calling convention(默认的调用约定) for C and C++ programs. Because the stack is cleaned up by the caller, it can do vararg functions.(这里提供了一条非常重要的信息:只有由调用者来清理堆栈的函数才能够声明为变参函数) The __cdecl calling convention creates larger executables than __stdcall,(这种方式生成的可执行程序要比_stdcall方式生成的可执行文件要大) because it requires each function call to include stack cleanup code. The following list shows the implementation of this calling convention.下面的表格中主要包含:

参数传递顺序:从右向左   (注:注意区别参数传递顺序与参数计算顺序,在c++中并没有规定参数计算顺序。) 

cout和printf的缓冲机制 / 蓝讯  http://www.lxway.com/66081202.htm

堆栈维护责任:调用函数将参数从堆栈中pop.

名称修饰约定:指的是根据何种算法来为每个函数生成一个唯一的名字

case-translation convention:?????

image

On ARM and x64 processors, __cdecl is accepted but typically ignored by the compiler. By convention on ARM and x64, arguments are passed in registers when possible, and subsequent arguments are passed on the stack. In x64 code, use __cdecl to override the /Gv compiler option and use the default x64 calling convention.

For non-static class functions, if the function is defined out-of-line, the calling convention modifier does not have to be specified on the out-of-line definition. That is, for class non-static member methods, the calling convention specified during declaration is assumed at the point of definition.

对于非静态类成员函数,如果函数的定义不一致,调用方式修饰符并不一定要在不一致的定义中指定,即对于类中的非静态成员函数,在声明时指定的调用方式约定将在定义时呈现。

Given this class definition:

struct CMyClass { void __cdecl mymethod(); }; 

this:

void CMyClass::mymethod() { return; }   //即只要在声明中指定即可,而不要在定义再重新声明,防止造成不一致,而适得其反。
is equivalent to this:

void __cdecl CMyClass::mymethod() { return; }

Example

In the following example, the compiler is instructed to use C naming and calling conventions for the system function.

// Example of the __cdecl keyword on function
int __cdecl system(const char *);
// Example of the __cdecl keyword on function pointer
typedef BOOL (__cdecl *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);

===========================

The document is archived and information here might be outdated

__stdcall

Microsoft Specific

The __stdcall calling convention is used to call Win32 API functions. The callee cleans the stack(被调用者清理堆栈。note:这也是没办法的事,因为如果用户程序调用win32 API, 由于windows内部实现的不了解,无法完成相关的清理工作,即使微软提供了相关的实现说明,由用户来承担相关的清理工作也可能是一项繁琐的工作,甚至可能造成系统的不稳定。), so the compiler makes vararg functions __cdecl. Functions that use this calling convention require a function prototype.

 

return-type __stdcall function-name[(argument-list)]

The following list shows the implementation of this calling convention.

image

The /Gz compiler option specifies __stdcall for all functions not explicitly declared with a different calling convention.

对于所有没有显式用其他调用约定声明的函数,Gz编译器默认指定为__stdcall.(note:前面不是说__cdecl是C和c++默认的调用方式吗?)

Functions declared using the __stdcall modifier return values the same way as functions declared using __cdecl.

On ARM and x64 processors, __stdcall is accepted and ignored by the compiler; on ARM and x64 architectures, by convention, arguments are passed in registers when possible, and subsequent arguments are passed on the stack.

For non-static class functions, if the function is defined out-of-line, the calling convention modifier does not have to be specified on the out-of-line definition. That is, for class non-static member methods, the calling convention specified during declaration is assumed at the point of definition. Given this class definition,

上面这两段和下面这一段与前面介绍__cdecl中的内容大致相同。

C++

struct CMyClass { void __stdcall mymethod(); }; 

this

C++

void CMyClass::mymethod() { return; } 

is equivalent to this

C++

void __stdcall CMyClass::mymethod() { return; } 
Example

In the following example, use of __stdcall results in all WINAPI function types being handled as a standard call:

C  //操作系统函数一般者是用c语言编写。

// Example of the __stdcall keyword
#define WINAPI __stdcall
// Example of the __stdcall keyword on function pointer

//这里…是表示变参的意思吗???
typedef BOOL (__stdcall *funcname_ptr)\(void * arg1, const char * arg2, DWORD flags, ...);  

=================================

__fastcall

Microsoft Specific

The __fastcall calling convention specifies that arguments to functions are to be passed in registers, (note:用寄存器传参确实会比较快)when possible. This calling convention only applies to the x86 architecture. (note:对于x64不需要指定就是这样,上文有提及)The following list shows the implementation of this calling convention.

__fastcall的前两个参数会放入ecx,edx  (下面表格中第一行也有说明)

image

Future compiler versions may use different registers to store parameters.

Using the /Gr compiler option causes each function in the module to compile as __fastcall unless the function is declared by using a conflicting attribute, or the name of the function is main.

The __fastcall keyword is accepted and ignored by the compilers that target ARM and x64 architectures; on an x64 chip, by convention, the first four arguments are passed in registers when possible, and additional arguments are passed on the stack. On an ARM chip, up to four integer arguments and eight floating-point arguments may be passed in registers, and additional arguments are passed on the stack.(note:在arm中能够用寄存器传递的参数的个数也是受限的,额外的参数仍然在栈上传递)

C++

struct CMyClass {
   void __fastcall mymethod();
};

this:

C++

void CMyClass::mymethod() { return; }

is equivalent to this:

C++

void __fastcall CMyClass::mymethod() { return; }

Example

In the following example, the function DeleteAggrWrapper is passed arguments in registers:

C

// Example of the __fastcall keyword
#define FASTCALL    __fastcall

void FASTCALL DeleteAggrWrapper(void* pWrapper);
// Example of the __ fastcall keyword on function pointer
typedef BOOL (__fastcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);

-------------------------------
__thiscall  C++成员函数专用,不支持变参。

The __thiscall calling convention is used on member functions and is the default calling convention used by C++ member functions that do not use variable arguments. Under __thiscall, the callee cleans the stack, which is impossible for vararg functions. Arguments are pushed on the stack from right to left, with the this pointer being passed via register ECX(note:???????), and not on the stack, on the x86 architecture.

One reason to use __thiscall is in classes whose member functions use __clrcall by default. In that case, you can use __thiscall to make individual member functions callable from native code.(基本不会用到)

When compiling with /clr:pure, all functions and function pointers are __clrcall unless specified otherwise.

In releases before Visual C++ 2005, the thiscall calling convention could not be explicitly specified in a program, because thiscall was not a keyword.

vararg member functions use the __cdecl calling convention. All function arguments are pushed on the stack, with the this pointer placed on the stack last.(note:并不是所有的成员函数只能指定为__thiscall函数调用方式,对于变参成员函数,调用方式使用的是__cdecl,而且也只能是这个。this指针是类的非静态成员函数的一个隐含的参数,它被放在函数堆栈中是所有参数中最后一个被放入堆栈的。)

Because this calling convention applies only to C++, there is no C name decoration scheme.

On ARM and x64 machines, __thiscall is accepted and ignored by the compiler.

For non-static class functions, if the function is defined out-of-line, the calling convention modifier does not have to be specified on the out-of-line definition. That is, for class non-static member methods, the calling convention specified during declaration is assumed at the point of definition.

Example
// thiscall_cc.cpp
// compile with: /c /clr:oldSyntax
struct CMyClass {
   void __thiscall mymethod();
   void __clrcall mymethod2();
};
-----------------------------

 

 

__vectorcall

Microsoft Specific

The __vectorcall calling convention specifies that arguments to functions are to be passed in registers, when possible. __vectorcall uses more registers for arguments than __fastcall or the default x64 calling convention use. The __vectorcall calling convention is only supported in native code on x86 and x64 processors that include Streaming SIMD Extensions 2 (SSE2) and above. Use __vectorcall to speed functions that pass several floating-point or SIMD vector arguments and perform operations that take advantage of the arguments loaded in registers. The following list shows the features that are common to the x86 and x64 implementations of __vectorcall.

image

Using the /Gv compiler option(note:这个选项中后面的v代表了__vectorcall) causes each function in the module to compile as __vectorcall unless the function is a member function, is declared with a conflicting calling convention attribute(note:这里指的是用另一种调用约定属性指定), uses a vararg variable argument list, or has the name main.(note:一些不能使用__vectorcall的情况,另外如果有变参列表,只能用__cdecl,另外对于main函数不能使用__fastcall、__thiscall、__vectorcall,可以使用的只有__cdecl、__stdcall)。

You can pass three kinds of arguments by register in __vectorcall functions: integer type values, vector type values, and homogeneous vector aggregate (HVA) values.

An integer type satisfies two requirements: it fits in the native register size of the processor—for example, 4 bytes on an x86 machine or 8 bytes on an x64 machine—and it’s convertible to an integer of register length and back again without changing its bit representation. For example, any type that can be promoted to int on x86 (long long on x64)—for example, a char or short—or that can be cast to int (long long on x64) and back to its original type without change is an integer type. Integer types include pointer, reference, and struct or union types of 4 bytes (8 bytes on x64) or less. On x64 platforms, larger struct and union types are passed by reference to memory allocated by the caller; on x86 platforms, they are passed by value on the stack.

A vector type is either a floating-point type—for example, a float or double—or an SIMD vector type—for example, __m128 or __m256.

注:Single Instruction Multiple Data,单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。

----------------------

__clrcall 

(个人理解只有用到托管代码和c++代码相互调用时才需要关注,而且只在windows下有效)

指定只能从托管代码调用的函数。对所有只能从托管代码调用的虚函数使用 __clrcall。 但是,此调用约定不能用于从本机代码调用的函数。

当通过指针从托管函数调用到虚拟托管函数或从托管函数调用到托管函数时,可使用 __clrcall 来提高性能。

入口点是编译器生成的单独函数。 如果函数同时具有本机和托管入口点,则其中一个将是具有函数实现的实际函数。 其他函数将是调用到实际函数的单独函数(形式转换 (thunk))并允许公共语言运行时执行 PInvoke。 当将函数标记为 __clrcall 时,您可以指示函数实现必须是 MSIL,并且不生成本机入口点函数。

当采用本机函数的地址时,如果未指定 __clrcall,编译器将使用本机入口点。 __clrcall 指示函数为托管函数,并且不需要经历从托管到本机的转换。 在这种情况下,编译器将使用托管入口点。

当使用了 /clr(不是 /clr:pure 或 /clr:safe )而未使用 __clrcall 时,采用函数的地址将始终返回本机入口点函数的地址。 当使用了 __clrcall 时,不会创建本机入口点函数,因此您将获得托管函数的地址,而不是入口点形式转换 (thunk) 函数的地址。 有关详细信息,请参阅双重 Thunk (C++)。

/clr(公共语言运行时编译) 表示所有函数和函数指针都是 __clrcall,且编译器不允许将编译单位中的函数标记为 __clrcall 之外的任何内容。 当使用 /clr:pure 时,__clrcall 只能在函数指针和外部声明上指定。

可以直接从使用 /clr 编译的现有 C++ 代码调用 __clrcall 函数(只要该函数具有 MSIL 实现)。 例如,__clrcall 函数无法直接从具有内联 asm 的函数调用,且无法调用特定于 CPU 的内部函数,即使这些函数是使用 /clr 编译的。

函数调用的几种方式:__cdecl、__stdcall、__fastcall、__thiscall、__clrcall、__vectorcall 调用约束,__cdecl/__stdcall/__fastcall 阅读详情

相关推荐

C++底层实现:宏与调用约定在std::function源码中的关键作用

在C++底层开发与系统级编程中,理解函数调用机制和代码生成技术是深入掌握语言核心的关键。函数调用约定(Calling Convention)定义了参数传递、栈管理和名称修饰等底层协议,是连接高级语言语法与机器码执行的桥梁,直接影响程序的二进制兼容性与性能。常见的cdecl、stdcall、thiscall等约定分别对应不同的调用场景,如C语言默认调用、Windows API标准以及C++成员函数调用。这些约定确保了函数调用时栈帧的正确构建与清理,是跨模块调用和回调函数安全运行的基础。与此同时,C/C++预处

WGH100817的博客 454

c语言报错-- no previous prototype for function

报错信息:  error: no previous prototype for function 当我们使用了一个函数,但是没有在头文件中声明时,就会出这个错误。 有时是因为去掉了static。static的函数使用和普通函数还是有区别的。static函数不需要声明。 解决办法,头文件中添加声明即可。

u010029439的博客 4万+

GAN模型中的常见变体有哪些,如DCGAN、WGAN和CGAN等?

生成对抗网络(GAN)是一种强大的深度学习模型,它由生成器和判别器两个网络组成,通过对抗训练的方式实现生成数据的能力。随着研究的发展,出现了许多GAN的变体,每个变体都有其独特的改进和特点。

huidhsu的博客 2262

从 DLL 导出函数

如果要导出 C++ 文件中的函数

m0_60352504的博客 1055

Palantir解密:“本体”的建模逻辑及其扩展方向

上一篇重点从对现实世界建模的角度探讨了“本体”在数字化架构中的核心意义。这里借Palantir的“本体”概念、解析Palantir只是起点,目标旨在以他山之石攻玉——探索数字世界的底层架构逻辑,最终为构建自主体系提供思考。Palantir以“本体论”为核心的建模方案是否代表终极答案,不宜过早下结论,但其思路值得深入剖析。

SZSDQJC的博客 2635

SAP 财务快速记账之--科目分配模型(Account assignment model )

SAP FICO 运维解决方案

lijinbao171022的博客 1768

c语言唯一一个不能被别的函数调用,VC C/C++ 函数调用约定(最全)

函数调用约定常见的函数调用约定[5]:cdecl,stdcall,fastcall,thiscall,naked callMFC调用约定(VS6:Project Settings->C/C++ Calling convention:)1, __cdecl(C调用约定.The C default calling convention)C/C++ 缺省调用方式1)压栈顺序:函数参数从右到左2)参...

weixin_39714565的博客 1201

从零上手:基于英飞凌TC377的UDE STK 5.0实战调试指南

本文详细介绍了基于英飞凌TC377芯片和UDE STK 5.0的实战调试指南,涵盖硬件连接、工作空间配置、程序烧录、多核调试等关键步骤。特别针对汽车电子领域常见的多核架构调试难题,提供了断点设置、变量监控等实用技巧,帮助开发者快速上手并优化调试效率。

weixin_30839881的博客 683

DLL 的编写,导出函数

//在编程c++dll时 extern "C"和.def的作用  extern "c"是c++编译器在编译函数时以c编译器的方式处理函数名  而.def的作用也是告知编译器以.def导出的文件名的方式编译函数名 动态链接库的使用有两种方式,一种是显式调用。一种是隐式调用。 (1)       显式调用:使用LoadLibrayr载入动态链接库、使用GetProcAddress获

hanyujianke的专栏 1万+

Centos7.9使用kubeadm部署K8S集群

使用kubeadm部署一个k8s集群,单master+2worker节点。

lldhsds的专栏 1302

LaTeX公式转Word竟这么简单?Python三行代码实现学术论文格式无忧

本文介绍如何利用Python的latex2word库,仅需三行代码即可将LaTeX数学公式精准转换为Word原生Office Math对象,解决学术写作中LaTeX与Word格式割裂的难题。该方法支持批量处理、格式保真,并能与Markdown、Jupyter Notebook等工具集成,构建自动化写作流程,实现学术论文格式无忧。

qsc90123456的博客 296

__cdecl、__clrcall、__stdcall、__fastcall、__thiscall、__vectorcall等含义

调用约定(Calling Convention) 是计算机编程中一个比较底层的设计,它主要涉及: 函数参数通过寄存器传递还是栈? 函数参数从左到右还是从右到左压栈? 是否支持可变参数函数(vararg function or variadic function)? 是否需要函数原型? 调用者(caller)还是被调用者(called or callee)清理堆栈? 官方详解可见:h

benben198621的博客 2401

从Overleaf上导出Latex论文发布到arxiv详细教程(常见问题与解决)

如果是做cv的论文请选择“Computer Vision and Pattern Recognition”,选择“Artificial Intelligence”可能会被on hold,貌似这个指的是传统的人工智能?我用公司邮箱注册发布一篇论文,一个多月还是“on hold”状态,换成edu邮箱第二天就被发布了。3、有可能是subject class选错了,编辑会帮你手动选择,然后发一封邮件告知你解除……报错缺失bbl等文件,这是因为从Menu中下载的话,是没有bbl文件的。论文被on hold。

沉迷单车的追风少年 3586

Visual C++ 编译器参数传递和命名约定——关于__cdecl和__stdcall

通过 Visual C++编译器,您可以为传递参数指定约定并返回函数和调用方之间的值。 并非所有支持的平台上都有所有约定,因此某些约定使用特定平台的实现。 在大多数情况下,忽略指定特定平台上不受支持约定的关键字或编译器开关,和使用平台默认约定。 在 x86 平台上,在通过时,所有参数扩展到 32 位。 回归值也扩展为 32 位,并且返回 EAX 寄存器,除了 8 字节结构返回 DEX:EAX 寄

学习分享 1015

机器人中的数值优化(十五)——PHR增广拉格朗日乘子法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例

慕羽★的博客 2002

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C/C++中函数调用规则(约定)__cdecl __stdcall __thiscall __vectorcall __fastcall

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33929309的博客 309

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C&C++ Calling Convention

tkorays(tkorays@hotmail.com) 调用约定(Calling Convention) 是计算机编程中一个比较底层的设计,它主要涉及: 函数参数通过寄存器传递还是栈? 函数参数从左到右还是从右到左压栈? 是否支持可变参数函数(vararg function or variadic function)。 是否需要函数原型? 怎么修饰函数名,唯一标识函数? ...

weixin_30448603的博客 284

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

教你看懂C++类库函数定义之三---_stdcall

上篇文章我们知道#define STDMETHODCALLTYPE __stdcall ,那__stdcall又是个什么东东呢,有什么作用呢?下面来完全的了解一下. 1. _cdecl   (1). 是C Declaration的缩写,表示C语言默认的函数调用方法,实际上也是C++的默认的函 数调用方法。  (2). 所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。具体所示:

程序猿GTC 9441

C#动态调用C++编写的DLL函数

转: C#动态调用C++编写的DLL函数 C#动态调用C++编写的DLL函数 动态加载 DLL 需要使用 Windows API 函数: LoadLibrary 、 GetProcAddress 以及 FreeLibrary 。我们可以使用 DllImport 在 C# 中使用这三个函数。[DllImport("Kernel32")] public static extern int G

liuhhaiffeng的专栏 1432

调用约定

在windows平台上的C++编程中经常会看到一些__stdcall, __cdecl, WINAPI, CALLBACK等等关键字在函数前面,在.NET中还有__clrcall, __thiscall等关键字,有时加不加它们都可以,但是有时必须加上,不然编译不过。本文要讨论的就是这些关键字:调用约定(Calling Convention),有时也叫做“函数调用约定”或者“调用规范”。本文采用MS

zjwoody的专栏 9284

__stdcall 和 __cdecl 的区别浅析

_cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,由调用者负责把参数压入栈,最后也是由调用者负责清除栈的内容,一般来说,这是 C/C++ 的默认调用函数的规则,MS VC 编译器采用的规则则是这种规则2. __stdcall。__cdecl 规则要求调用者本身负责栈的恢复工作,在汇编的角度上说,恢复堆栈的位置是在调用函数内,考虑这样一段 C++ 代码(在 VC 下 Debug)

笔记 959

DLL编写中extern “C”和__stdcall的作用

动态链接库的使用有两种方式,一种是显式调用。一种是隐式调用。 (1)       显式调用:使用LoadLibrary载入动态链接库、使用GetProcAddress获取某函数地址。 (2)       隐式调用:可以使用#pragma comment(lib, “X...

qq_38883139的博客 1552

stdcall调用约定分析,以c语言为分析对象

                     stdcall调用约定分析,以c语言为分析对象                           yckyck2001 stdcall调用约定分析,以c语言为分析对象(一)-、编译平台 本文中C代码的编译平台为VC6.0,编译版本为Debug版本。 二、研究的C代码 int __stdcall stdcallFun

sky的天空 1080

c/c++中_stdcall与dll动态调用

1._stdcall在动态dll调用中的注意事项 为了用vc写的dll能被其它语言的写的程序使用,即实现跨语言。我们在dll的函数调用约定中使用__stdcall . 但当用GetProcAddress调用是却失败了. 用dumpbin工具查看导出的函数名可以看到:导出的函数名确实为_mygetGrad@20 所以我们要阻止导出的函数名被编译器修改,方法就是使用de

mrljw的博客 8897

在C++实现回调

在C++实现回调  来看看怎么在C++中实现回调吧。 Method1:使用全局函数作为回调 在C语言中的回调很方便。当然,我们可以在C++中使用类似于C方式的回调函数,也就是将全局函数定义为回调函数,然后再供我们调用。 typedef void(*pCalledFun)(int *); void GetCallBack(pCalledFun parafun) { /*do

jssyy123的专栏 1130
上一篇: 数据分析框架Pandas进阶
下一篇: TBB使用教程
Baoli1008
博客等级 码龄12年 70粉丝 293原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值