【问题标题】:How to print Hello World in an empty main function如何在空的主函数中打印 Hello World
【发布时间】:2018-02-20 16:44:56
【问题描述】:

我遇到了一件有趣的事情。在一次采访中,我被要求在控制台上打印“Hello World”。但主要功能必须是:

int main(void) 
{
    return 0;
}

不得修改!

【问题讨论】:

  • c++c ?选择,因为我认为你不能在 C 中做到这一点
  • 哪种语言?它们是不同的语言,答案可能因语言而异。
  • 答案是 hack。您可能需要重新考虑在一家提出此类问题的公司工作。
  • 不,因为在 C 中你不能用非常量表达式初始化变量。
  • 好吧,为什么这个问题吸引了这么多回答者

标签: c++


【解决方案1】:

我试过#define return printf("Hello World"); 使用 C++ 和 MinGW GCC。 即使这就像没有风格;)

【讨论】:

  • @Jean-FrançoisFabre;在这种情况下,分号是必需的。
【解决方案2】:
class TEST{
public:
    TEST(){
        cout << "Hello World";
    }
};
TEST test_obj; //Create an instnace to TEST Class

int main(){
    return 0;
}

【讨论】:

  • 这个问题用 C 和 C++ 标记。这样的解决方案将无法在 C 中编译。
【解决方案3】:

NeverToLow beat me to it.

这适用于 C 或 C++(当然,这两种语言的风格都非常糟糕):

#include <stdio.h> 
#define return puts("Hello World");
int main(void) {
    return 0;
}

宏定义中的分号是必须的。它使下面的0; 成为一个语句表达式,它什么也不做。 (在 C++ 和从 C99 开始的 C 中,从 main 的末尾脱落会隐含 return 0;。)

【讨论】:

  • 我会推荐:#define return puts("Hello World"); return 最后的“return”实际上让你返回一个值。
  • 这太丑太可怕了,它几乎很漂亮;-)
  • @abelenky:没必要。如果您正在考虑设计return 宏,使其更加健壮和灵活,并且可以在维护代码时安全使用——请停下来想想您在做什么。 8-)}
  • 这不是一个好的答案,因为预处理器会将宏 return 替换为该语句 puts("Hello World")。因此,如果我们针对生成中间文件进行编译,我们会在 main 中找到它。
  • @ItachiUchiwa 我不同意。我的回答符合要求,没有说明任何中间结果应该是什么样子。需求是丑陋的,所以丑陋的解决方案是不可避免的。
【解决方案4】:

包含重新定义return 的宏方法很好,但也有一些缺点,因为它不严格符合c89 标准并产生一些警告:

> gcc -std=c89 -Wall test.c
test.c: In function 'main':
test.c:7:12: warning: statement with no effect [-Wunused-value]
     return 0;
            ^
test.c:8:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^

现在我们可以从这个方法派生,只重新定义main,然后再定义一个未使用的函数

#include "stdio.h"

#define main(x) main(x) { printf("Hello world\n"); return 0; } int foo()

int main(void) 
{
    return 0;
}

预处理器输出:

int main(void) { printf("Hello world\n"); return 0; } int foo()
{
    return 0;
}

现在程序编译没有警告,符合 c89 标准,并且不重新定义关键字。

【讨论】:

    【解决方案5】:

    你可以在main之前定义一个函数,并传递一个构造函数来打印Hello World。

    #include<bits/stdc++.h>
    using namespace std;
    class print{
        print(){
            cout << "Hello World";
        }
    };
    print obj;
    
    int main(){
        return 0;
    }
    

    您也可以使用宏预处理器(定义宏)。

    #include<bits/stdc++.h>
    using namespace std;
    
    #define return printf("Hello World");
    
    int main(){
        return 0;
    }
    

    【讨论】:

      【解决方案6】:

      您可以将其与共享库链接,并在 Windows 下将 return printf("Hello World"); 放入 DLLmain 或在 Linux 下使用选项 -init,DLLMain 进行编译。

      【讨论】:

        【解决方案7】:

        您可以将该功能移至初始化代码中。例如,在 C++ 中,您可以声明一个类的静态实例,然后在类构造函数中打印该消息。

        或者,您可以通过#pragma 包含一个库并在“加载”事件中执行该代码: https://stackoverflow.com/a/9759936/1964969

        【讨论】:

        • 这个问题用 C 和 C++ 标记。这样的解决方案在 C 中不起作用。此外:所有 #pragmas 都是特定于编译器的,因此它不是可移植代码。
        • 是的,pragma 是非标准的扩展(这就是它被发明的原因)。不,如果编译器支持,编译指示即使在纯 C 中也可以工作。例如,“#pragma startup foo”将完全符合 Rasul 的要求:在应用启动时启动 foo()。
        • 对不起,如果我不够清楚,我的意思是“声明一个类的静态实例,然后在类构造函数中打印该消息”在 C 中不起作用;并且由于#pragmas 依赖于编译器,因此在不知道目标编译器/架构是否支持的情况下推荐它是没有意义的。
        • 是的,静态类在 C 中不起作用,这就是为什么我将它们指定为“例如,在 C++ 中......”。根据编译指示,它们被用于大多数编译器,所以问题只是为给定的编译器/操作系统找到必要的编译器(例如,对于同一件事,相同的编译器在 Windows 和 Linux 中可能有不同的编译指示)。
        【解决方案8】:

        你可以简单地通过创建一个类来做到这一点。在这段代码中,我们在 HelloWorld 类中创建了一个构造函数,该构造函数将打印 Hello World,因此每当我们创建 HelloWorld 类的对象时。编译器将检查 HelloWorld 类中写入的内容,当它看到该类中有构造函数时,它将检查该构造函数中写入的内容。我们已经编写了将打印 HelloWorld 的代码。因此,由于我们的构造函数,它将使该对象打印 Hello World。希望这段代码和解释对你有帮助

        #include <bits/stdc++.h>
        using namespace std;
        
        class HelloWorld
        {
        public:
        
        HelloWorld()
        {
            cout << "Hello World" << endl;  
        }
        
        };
        
        HelloWorld obj;
        
        int main()
        {
        return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 2014-01-10
          • 2018-03-26
          • 2015-05-04
          • 1970-01-01
          • 2018-03-11
          • 1970-01-01
          • 1970-01-01
          • 2013-08-23
          • 1970-01-01
          相关资源
          最近更新 更多