【发布时间】:2018-12-29 16:26:53
【问题描述】:
我正在使用我自己的函数创建我自己的 C 库,也是为了帮助更好地理解 C,而不仅仅是依赖 GNU C 库。
到目前为止,我运行了一些函数,但我不想稍微调整我的 printo 函数以支持无限参数(仅限于字符,但您的答案也可能支持传入整数参数)。这是打印代码:
#include "../GV.h"
#include "OtherUtils.h"
int print(char *WRITEOUT1){
char *WRITEOUT=&WRITEOUT1[0];
int AMOUNT=GetCharSize(WRITEOUT1);
register int SYSCALLNO asm("rax")=SYSWRITE;
register int FD asm("rdi")=STANDARDFD;
register char *BUF asm("rsi")=WRITEOUT;
register int BYTES asm("rdx")=AMOUNT;
asm("syscall");
return 0;
}
GetCharSize 函数代码,如果有人需要的话:
#include "../GV.h"
int GetCharSize(char *arg){
for(i=0;arg[i]!='\0';i++){
}
return i;
}
GV.h 的变量定义类似于 int i;
在我问这个问题之前,我研究了像 __VA_ARGS__ 这样的 C 预处理器,但我有点无法理解它。
【问题讨论】:
-
搜索“可变参数函数”。很多例子。
man vfprintf一些例子。 -
不相关,但是:1) 已经存在简约的
printf实现,您可以使用而不是重新发明轮子(printf,tinyprintf)。 2)下降到汇编程序级别很可能是一个巨大的矫枉过正。分析,然后优化负责 80% 运行时间的 20% 代码。其他一切都只是烧别人的钱。 3)我希望i不是GV.h里面的全局变量? -
"GV.h 的变量定义为 int i;" - 抱歉,您这样做完全错误。该变量必须是函数内的局部变量
-
虽然有一个 ABI,但在 C 中传递的参数是“魔法”。不可能在 C 中针对 ABI 进行编码 - 您唯一可以使用的是 C 中的可变参数函数,并且只能在
<stdarg.h>的帮助下使用。 -
@AnttiHaapala 我能够在没有可变参数和 stdarg.h 的情况下做到这一点,哈哈