我一直认为printf()在最后一步中使用内联汇编定义函数.在stdio.h的内部深处埋藏了一些asm代码,它实际上告诉CPU要做什么.例如,在dos中,我记得它是通过首先mov将字符串的开头添加到某个内存位置或寄存器而不是调用intterupt来实现的.
但是,由于Visual Studio的x64版本根本不支持内联汇编程序,因此我想知道在C/C++中根本不会有汇编程序定义的函数.库函数如何printf()在不使用汇编代码的情况下在C/C++中实现?什么实际执行正确的软件中断?谢谢.
我想看一下不同C/C++函数的实现(比如strcpy,stcmp,strstr).这将有助于我了解c/c ++中的良好编码实践.你能告诉我在哪里可以找到它吗?
谢谢.
我想知道是否有任何可用的在线资源解释了什么事情,比如printf of C,它解释了在非常低级别发生的事情(BIOS /内核调用)
我学会了使用库stdarg.h来获取具有未知数量参数的函数.这是一个简单的函数如何使用:
void print(int args,...){
va_list ap;
va_start(ap, args);
int i = 0;
for(i=0; i<args; i++){
printf("%d\n",va_arg(ap, int));
}
va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)
基于上面的代码,有两个主要的约束,我不知道如何printf 克服:
1)固定数量参数:意思是,在几乎vardiac函数中,你需要包含args的数量.但是当我写作时printf,我不必包括这个数字.我以为在printf真正使用参数之前,它已经计算了之前的参数数量(通过计算第一个字符串中的数字%).但同样,我认为这个解决方案有点效率不高.它必须通过三个pharses:计算参数数量,并将这些参数放入堆栈,最后将所有参数放入屏幕.
2)所有参数必须具有相同的类型: 如下所示:printf("%d\n",va_arg(ap, int));.因此,列表中的每个参数都必须具有相同的类型.而且正如我们所知,这不是printf中必须的.您可以使用整数或字符串打印double.如果我们将所有这些视为一个字符串,那么这一行应该是错误的,因为错误的语法:
printf("%d",4); //4 cannot treat by string
printf("%d",'4'); // :)) I think this line is better
Run Code Online (Sandbox Code Playgroud)
请帮我解释一下上面两个问题.
我想知道的是编译器和程序是如何工作的.
例如,在'Hello,world!' 比方说,例如hello.c,就像每个人都知道的那样:(使用GNU gcc)
$ gcc -o hello hello.c
$ ./hello
Run Code Online (Sandbox Code Playgroud)
你好,世界!
我刚刚得到一个问题,如何printf定义或使用最简单和熟悉的功能之一.
为了自己找到答案,我发现整个头文件包含在stdio.h中,并包含在包含的文件中,包括在包含的文件中.stdio.h中包含近80个头文件.我查找每个文件是否包含"printf"一词.有3个头文件.
stdio.h(本身)
比特/ stdio2.h
比特/ STDIO-ldbl.h
我完全不了解预处理器语法,但我很确定这些文件中的文本不足以定义该printf函数.例如,在stdio.h中,printf大致如下所示:
...
namespace std{
...
extern int printf (const char *__restrict__format, ...);
...
}
...
Run Code Online (Sandbox Code Playgroud)
我知道它说的是语法和声明,但我认为它不是定义或构建的printf.
所以我认为内心深处有一些东西可以回答我的问题,我希望你们中的一些人有一个问题.
以下代码有什么问题?我们如何使print()函数作为printf工作?
#include <stdio.h>
#include<stdarg.h>
void print(char *format,...)
{
va_list args;
va_start(args,format);
printf(format,args);
}
int main() {
print("%d %s",5,"le");
}
Run Code Online (Sandbox Code Playgroud) 请考虑以下程序并观察输出.
#include <stdio.h>
int main()
{
unsigned long long val ;
val =144111444250;
printf ("%llu\n", val);
printf ("%u %llu\n",val, val);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
144111444250
33 10211385600662044705
Run Code Online (Sandbox Code Playgroud)
在第一个printf中使用%llu会得到正确的结果,但在第二个printf中使用%llu会得到错误的结果.