- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是一个奇怪的问题,但是在将 va_list
的内容传递给另一个函数之前,是否有一种标准的方法来操纵它?例如,假设我有两个函数,sum
和 vsum
:
int vsum(int n, va_list ap) {
int total = 0;
for (int i = 0; i < n; ++i) {
total += va_arg(n, int);
return total;
}
int sum(int n, ...) {
va_list ap;
va_start(ap, n);
int total = vsum(n, ap);
va_end(ap);
return total;
}
如果我将 sum
调用为 sum(4, 1, 2, 3, 4)
,我希望得到结果 10。现在让我们假设不是调用vsum
直接调用,sum
调用中间函数 vsum_stub
,它执行以下操作:
int vsum_stub(int n, va_list ap) {
va_list temp_ap;
va_copy(temp_ap, ap);
for (int i = 0; i < n; ++i) {
int *arg = &va_arg(ap, int);
*arg += 2;
}
va_end(temp_ap);
return vsum(n, ap);
}
现在当我调用 sum(4, 1, 2, 3, 4)
时,我应该得到结果 20,因为 vsum_stub
递增了va_list
为 2。这当然不能编译,因为您不能获取 va_arg
结果的地址。还有另一种方法可以做到这一点吗?我在 C99 工作。
背景:
我正在开发一个可以进行一些指针转换的库,以便数据可以更有效的格式存储在堆上。程序是使用自定义转换编译的,该转换将对 printf
等库函数的调用转换为我自己的 stub 函数(例如,hc_printf
)。在将参数传递给真正的 printf
函数之前,hc_printf
需要转换任何指针参数(用于 %s
的字符串)。
编辑:这是一个代码示例。假设我们有一个字符串 foo
。 foo
是使用修改后的 malloc
动态分配的,它返回一个假指针。编译器修改程序,使其可以处理假指针。所以这有效:
char *foo = fake_malloc(4);
fake_strcpy(foo, "foo");
我想写一个这样的fake_vprintf
函数(伪代码):
int fake_vprintf(const char *format, va_list args) {
for each pointer argument p in args
translate p to q, a real pointer to contiguous memory
replace p with q in args
}
return vprintf(format, args);
}
程序将调用 fake_vprintf
就像使用假指针的原始 vprintf
一样。 fake_vprintf
将假指针转换为真正的指针,真正的 vprintf
可以使用。
最佳答案
啊哈,据我了解,您的问题是创建一个新的 va_list
参数以传递给标准 vprintf
函数。反过来,这将要求您修改列表中的每个成员。但是,由于没有针对此类列表的元素明智的提取/编辑/插入操作,因此您陷入困境。
我真的看不出有什么办法可以做到这一点。当然,您可以创建一个 vprintf
就地 应用转换,一次一个参数。我的建议是:重新实现所有 此类标准库函数——无论如何您都在编写包装器。这涉及一些工作,但您已经使用 hc_printf
等完成了其中的一部分,所以为什么不走完全程(猜猜函数调用节省了什么!)。
关于c - 操纵可变参数的标准方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2210379/
我是puppeteer的新手(通常对javascript不太了解),并且正在尝试编写一些基本功能来: 从XPath获取所有链接 循环浏览并单击那些链接 屏幕截图并保存页面的HTML 返回屏幕快照,然后
您好,我正在尝试创建一个我想通过网络发送到服务器的数据包,我几乎已经对数据包进行了排序,但是它缺少一个长度标识符,我需要在我的方法结束时计算它并添加放入数据包。 数据包结构是这样的 前导值标识符 (U
我正在尝试更改按钮的样式(实际上只是一个 div)。我可以在 CSS 中使用 .classname:active 来实现,但是按钮只会在被点击时改变样式;单击释放后,它不会保持样式更改。所以,我决定使
我有一个下拉导航栏(fiddle here 和下面的代码片段)。单击 SubItem 时,JS 函数会进行 Ajax 调用(未显示)。我想要实现的是在单击 SubItem 时隐藏 SubItems 列
给定一组平面图(Autocad、svg 或任何需要的格式...),我想以编程方式生成从 A 点到 B 点的方向。基本上我想说:“我如何获得从101房间到143房间?” (或三倍奖励积分,从 101 房
我在 Win32 下的 MS dev studio 中将一些代码从 C 转换为 C++。在旧代码中,我使用 QueryPerformanceCounter() 进行了一些高速计时,并对获得的 __in
我正在寻找一种方法来从 QTableWidget 单元格中挤出所有可能的空间。我粘贴了一些代码来演示我在下面尝试过的事情,并且我上传了在 OSX 10.8.5、Qt 4.8.4、PySide 1.2.
对于 PhoneGap 移动应用程序,我有以下场景: 应用程序打开并显示index.html 用户登录并被重定向到 home.html 然后用户可以转到 news.html 我想以一种方式处理 hom
可能是一个简单的问题: 尝试使用plotly生成散点图并自定义图例。 这是我的数据: require(plotly) set.seed(1) my.df % add_annotations(text=
在 Instagram/Facebook 上的帖子下方,您会看到类似“第 1 个人、第 2 个人和其他 10 个人喜欢此帖子”的文字。我想知道如何使用 Django 来实现网站的相同效果?通常,我会使
我必须使用 Form.Action 重定向到将从我的页面获取值的脚本。值得注意的是,这个脚本是外部的。 我的问题是,我还想要被点击并连接了 Action 的按钮,以便首先在后面的代码中完成一些功能。
我有一个问题。 我可以在 Express 中操纵路线吗?当我发出 get 或 post 申请地址时,我可以将 2 条路线传递到同一个 get 或 post 申请吗?像这样的东西。 module.exp
如果我在不同的 Canvas 上绘制我的图像,我可以使用 js 库应用一些效果,如淡入淡出、移动和其他效果吗?如果可能的话,在速度和性能方面可能会很有趣,而不是操纵“原始”?非常感谢 最佳答案 if
我希望你能帮助我。如何转换这个扁平的 JavaScript 数组,来自: [ {"state":"First State","district":"First District","local_
我有一个 React JSX 元素,我想遍历它的子元素,对其中的每个字符串元素执行替换(或任何其他操作),然后返回新的、修改后的 JSX 元素。例如: var element = Text { var
我正在制作一个 Java 网络项目,我想在其中使用一些 javascript 操作一些前端 SVG 元素。 我正在绘制一个相当简单的车库图,其中有一个来自 JSP 页面的棚屋元素。 我想要一个 jav
我读过许多帖子,其中人们询问有关对 XML 元素强制执行某些属性顺序的问题,一般的回答是这不合法/必需/不允许/相关/其他。 我不是在寻找任何说我不应该关心属性顺序的回复,所以如果这是你的观点,请不要
大家好,我的问题是,如何将两个 C 风格的字符串 append 到一个字符串中? 我对 C++ 的处理方式 (std::string) 很感兴趣,我从未接触过 C 风格的字符串,需要为我当前的开发项目
我选择了 HTML 页面上的所有节点,如下所示: var all = $('*'); 然后我遍历每个节点,检查每个节点是否有关联的文本值: var newDom = all.map((i, node)
示例取自 Mozilla's help page re = /(\w+)\s(\w+)/; str = "John Smith"; newstr = str.replace(re, "$
我是一名优秀的程序员,十分优秀!