gcc对C语言的扩展:构造函数调用(Constructing Function Calls)

简介:
在不知道一个函数所接收到的参数的个数或类型的情况下,我们可以用GCC有一套内建函数记录下参数并将他们用于调用其他的函数。

你也能够在不知道一个函数的返回类型的情况下获得函数调用的返回结果,然后再返回这个结果(只要调用你所在函数的调用者能接收这个返回值的数据类型)。

Built-in Function: void * __builtin_apply_args ()
这个内建函数返回一个指向某些数据的指针,这数据描述了如何用传给当前函数的参数来执行一个函数调用。 这个函数会在栈中某个内存地址保存参数指针寄存器,struct结构地址和其他一些可能用于传递参数的寄存器的值, 然后这个函数返回这块内存的地址。   

Built-in Function: void * __builtin_apply (void (*function)(), void *arguments, size_t size)
这个内建函数将用保存下来的参数的拷贝来调用function函数, 参数由arguments指针指向的地址和size表示的大小来表示。arguments指向的内容应该是__builtin_apply_args函数返回的地址,参数的尺寸size指定了栈数据的大小,用字节作为单位。这个函数返回一个指针,它指向function函数返回值的数据。返回值被保存在栈中分配的一段内存地址中。   

计算出合理的size的值并不总是件容易的事情。size值被__builtin_apply函数用于计算argument指针指向内存去中被压入栈中的数据量的大小。

Built-in Function: void __builtin_return (void *result)
这个内建函数返回result所描述的返回值。result应该为__builtin_apply函数的返回值。

这里使用的几个函数都是以下划线打头的。 使用以下划线开头的名字来表示局部变量是为了避免与在表达式中取代a和b之类名字(如宏)的变量名冲突。最终我们期望设计一种新的声明语法形式--它允许我们声明那些作用域在其初始化后才开始的变量; 这是一种避免冲突的更为可靠的方法。




     本文转自nathanxu 51CTO博客,原文链接:http://blog.51cto.com/nathanxu/56650,如需转载请自行联系原作者



相关文章
|
6月前
|
NoSQL 编译器 程序员
【C语言】揭秘GCC:从平凡到卓越的编译艺术,一场代码与效率的激情碰撞,探索那些不为人知的秘密武器,让你的程序瞬间提速百倍!
【8月更文挑战第20天】GCC,GNU Compiler Collection,是GNU项目中的开源编译器集合,支持C、C++等多种语言。作为C语言程序员的重要工具,GCC具备跨平台性、高度可配置性及丰富的优化选项等特点。通过简单示例,如编译“Hello, GCC!”程序 (`gcc -o hello hello.c`),展示了GCC的基础用法及不同优化级别(`-O0`, `-O1`, `-O3`)对性能的影响。GCC还支持生成调试信息(`-g`),便于使用GDB等工具进行调试。尽管有如Microsoft Visual C++、Clang等竞品,GCC仍因其灵活性和强大的功能被广泛采用。
178 1
|
3月前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
71 1
|
9月前
|
存储 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(下)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
128 5
构造函数(function)可以使用 new 生成实例,箭头函数可以吗
构造函数使用 `new` 关键字可以生成实例对象,而箭头函数则不能用作构造函数,因为它没有自己的 `this` 上下文,使用 `new` 调用会抛出错误。
|
4月前
|
编译器 C语言
初识C语言:扩展世界观,选择语句之行
初识C语言:扩展世界观,选择语句之行
|
5月前
|
存储 算法 C语言
C语言手撕实战代码_二叉树_构造二叉树_层序遍历二叉树_二叉树深度的超详细代码实现
这段代码和文本介绍了一系列二叉树相关的问题及其解决方案。其中包括根据前序和中序序列构建二叉树、通过层次遍历序列和中序序列创建二叉树、计算二叉树节点数量、叶子节点数量、度为1的节点数量、二叉树高度、特定节点子树深度、判断两棵树是否相似、将叶子节点链接成双向链表、计算算术表达式的值、判断是否为完全二叉树以及求二叉树的最大宽度等。每道题目均提供了详细的算法思路及相应的C/C++代码实现,帮助读者理解和掌握二叉树的基本操作与应用。
127 2
|
5月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
9月前
|
编译器 C语言 C++
从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值(中)
从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值
56 1
从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值(中)
|
8月前
|
编译器 C语言
C语言编译详解:GCC分步编译与一次编译多个文件
C语言编译详解:GCC分步编译与一次编译多个文件
635 2
|
9月前
|
存储 安全 C语言
从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值(上)
从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值
49 2

热门文章

最新文章