【问题标题】:How to write a quine program without main()如何在没有 main() 的情况下编写一个 quine 程序
【发布时间】:2011-02-21 10:20:42
【问题描述】:

我经历了各种各样的quine问题,但我的任务是在没有main()的情况下得到一个quine问题,并且循环也被禁止。

没有循环,这很容易,但是没有main(),我不知道怎么写。任何人都可以帮助我或提供链接吗?

【问题讨论】:

  • 您真正需要哪种语言 - C 或 C++?
  • @sarnold...我做了一个小的quine,但它有main....很容易得到它并且更短..但是没有main...我不知道!!跨度>
  • 我相信这意味着不允许递归调用 main()。
  • 任务刚刚说main()函数被禁止了..
  • 空的源文件呢?它编译为没有 main()、循环或任何东西的 quine:)

标签: c quine


【解决方案1】:

如果没有main() 函数,您将无法创建(非独立的)C 程序。因此,在 C 中创建一个没有 main() 的 quine 在通常意义上是不可能的。

也就是说,根据您定义 quine 的方式,您可能能够构造一个无法编译的源文件,但其编译错误(在某个特定的编译器上)是源文件的内容。

【讨论】:

  • 看到人们说某些谜题解决方案“不可能”总是很有趣。
  • @Jim,所定义的问题在托管 C 环境中是不可能的,因为 C 标准要求在这样的环境中具有主要功能。可能是我对问题的解释,或者我对环境的假设是错误的。例如,如果问题实际上是“文本main 不应出现在程序中”,您可以进行愚蠢的预处理器黑客攻击。如果这是win32环境,可以使用非控制台子系统(独立环境)和winmain。但我无法读心,所以我必须假设对约束的正确解释应该是什么。
  • @bdonlan "如果问题实际上是......" -- 当然 确实如此,因为 quine puzzles 总是关于程序文本,而不是去查看 cpp 或 asm 或 obj 或 exe,在那里你可以找到 main 但无关紧要。
  • @bdonlan BTW,C 标准不“要求”任何东西。它只是指定什么是符合标准的程序或实现。有各种不合格的程序和不合格的实现,并且 OP 没有将一致性作为明确的要求。它甚至没有指定托管环境。我认为一个 Linux 内核——它没有 main()——在某些情况下会自我关闭,这将是相当不错的。谜题,尤其是 quines 之类的谜题,需要一些开箱即用的思考,而且不应该太快说出“不可能”。
  • Linux 内核是一个独立的环境,没有任何规则适用。如果操作系统只指定“C”,我们需要假设一个托管环境;否则,除非指定了环境,否则我们甚至不知道如何发出输出。是的,您也许可以从不需要main 的帽子中挑选出一个环境,但它很可能不是 OP 所希望的环境。
【解决方案2】:

首先它不可能在没有main 函数的情况下编写程序,因为编译器总是从main() 函数开始执行,没有main 函数链接器会不知道数据段的开始

是的,但是使用 预处理器的一些技巧你可以做到,但这不是一个好方法。

http://www.gohacking.com/2008/03/c-program-without-main-function.html

这可能会对你有所帮助。

也请看这里:

Is a main() required for a C program?

【讨论】:

  • 关于链接器和数据段的部分没有意义。
  • 第一个链接很搞笑。
  • 我尝试修复语法/拼写/格式,如果您不喜欢它,只需执行回滚到原来的帖子。
【解决方案3】:
#include <stdio.h>

int
foo(void) {
        printf("pong!\n");
        return 0;
}

int main() __attribute__((weak, alias("foo")));

有 main() 声明,但没有定义。

【讨论】:

  • 严格来说这不是标准的C,而是C的gcc方言。
  • 我称之为 main 的定义(当然,通过愚蠢的链接器黑客,但定义都是一样的)
猜你喜欢
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 2011-10-26
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 2018-04-18
相关资源
最近更新 更多