c/c++语言开发共享C代码:这些甚至如何工作?

我刚看到这里

#include  int main(int argc, char *argv[printf("Hello, world!n")]) {} 

这样做是打印“Hello World!”

但是这里到底发生了什么?

我能猜到的最好的是它被编译并抛出执行堆栈的顶部,但语法对我来说看起来不合法……

    该代码使用了C99的可变长度数组function,该function允许您声明仅在运行时知道其大小的数组。 printf返回一个等于实际打印的字符数的整数,因此代码打印出“Hello,world!” 首先使用返回值作为argv的大小。 mainfunction本身什么都不做。 printf本身的实际调用可能会进入编译器生成的启动代码,而编译器又调用main

    编辑:我刚检查了gcc生成的代码的反汇编,看来printf的调用是在main之前,在任何其他代码之前。

    如果我弄清楚编译器如何解析它,我会更新它,但至少不需要猜测它是如何编译的:

     objdump --disassemble /tmp/hello (edited): 080483c4 
    : 80483c4: 55 push %ebp 80483c5: 89 e5 mov %esp,%ebp 80483c7: 83 e4 f0 and $0xfffffff0,%esp 80483ca: 83 ec 10 sub $0x10,%esp 80483cd: b8 a0 84 04 08 mov $0x80484a0,%eax 80483d2: 89 04 24 mov %eax,(%esp) 80483d5: e8 22 ff ff ff call 80482fc 80483da: c9 leave 80483db: c3 ret 80483dc: 90 nop 80483dd: 90 nop 80483de: 90 nop 80483df: 90 nop

    由于Linux可执行文件通常位于0x8048000,因此printf参数的地址与二进制文件的起始位置的偏移量为0x00004a0:

     xxd /tmp/hello | grep 00004a0 00004a0: 4865 6c6c 6f2c 2077 6f72 6c64 210a 0000 Hello, world!... 

    因此,推送字符串的地址,并使用该arg调用printf。 没有什么神奇的东西,所以所有有趣的东西都是由gcc完成的。

    char *argv[printf("Hello, world!n")])

    printf()返回打印的字符数。

    所以

    int main(int argc, char *argv[printf("Hello, world!n")]) {}

    相当于

    int main(int argc, char *argv[14]) {}

    加上对printf()的调用,打印出"Hello World"

    我不是C专家,但看起来命令行参数与main同时声明。

    需要了解更多c/c++开发分享C代码:这些甚至如何工作?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享C代码:这些甚至如何工作?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/980483.html

      (0)
      上一篇 2021年12月14日
      下一篇 2021年12月14日

      精彩推荐