当前位置:  开发笔记 > 编程语言 > 正文

在不更改main()函数的情况下更改C++输出

如何解决《在不更改main()函数的情况下更改C++输出》经验,为你挑选了6个好方法。

好的,修复你的主要功能和iostream.h ......就是这样

#include 

// to make sure std::cout is constructed when we use it
// before main was called - thxx to @chappar
std::ios_base::Init stream_initializer;

struct caller {
    caller() { std::cout << "I "; }
    ~caller() { std::cout << " You"; }
} c;

// ohh well, for the br0ken main function
using std::cout;

int main()
{
    cout<<"Love";
}

我想我应该解释为什么会有效.该代码定义了一个具有构造函数和析构函数的结构.在创建struct的对象时运行构造函数,并在销毁该对象时运行析构函数.现在,在结构定义的末尾,您可以放置​​具有该类型的声明符caller.

所以,我们上面所做的是创建一个被调用的对象c,它在程序启动时被构造(并且构造函数被调用) - 甚至在main运行之前.当程序终止时,对象将被销毁并运行析构函数.在其间,main印有"爱".

这个模式实际上是众所周知的RAII,通常在构造函数中声明一些资源并在析构函数调用中再次释放它.



1> Johannes Sch..:

好的,修复你的主要功能和iostream.h ......就是这样

#include 

// to make sure std::cout is constructed when we use it
// before main was called - thxx to @chappar
std::ios_base::Init stream_initializer;

struct caller {
    caller() { std::cout << "I "; }
    ~caller() { std::cout << " You"; }
} c;

// ohh well, for the br0ken main function
using std::cout;

int main()
{
    cout<<"Love";
}

我想我应该解释为什么会有效.该代码定义了一个具有构造函数和析构函数的结构.在创建struct的对象时运行构造函数,并在销毁该对象时运行析构函数.现在,在结构定义的末尾,您可以放置​​具有该类型的声明符caller.

所以,我们上面所做的是创建一个被调用的对象c,它在程序启动时被构造(并且构造函数被调用) - 甚至在main运行之前.当程序终止时,对象将被销毁并运行析构函数.在其间,main印有"爱".

这个模式实际上是众所周知的RAII,通常在构造函数中声明一些资源并在析构函数调用中再次释放它.


@litb,答案可能不会一直有效.是否可以保证在调用者对象之前构建cout?C++标准是否要求在所有用户全局对象之前创建cout,cin?
非常感谢你,the_drow :)几天前我读过C++ 1x保证在包含#include 之后构建cout和朋友.所以我们不再需要stream_initializer了.在那之前,我会保留它,当然:P

2> Warrior..:
#include 
class tclass
{
  public:
    void operator <<(char *s)
    {
          std::cout<<"I"<



3> rlbond..:

不像litb那样优雅,但它有效

#include  
#include  
#include  

#define cout     printf("I love you\n"); std::ostringstream os; os 

int main() 
{ 
    cout << "love"; 
}

当然,你不需要使用a stringstream,你可以使用任何类operator<<.



4> CTT..:

不像litb那样优雅,但另类:

#include 
using namespace std;

int foo()
{
    cout << "I Love You" << endl;
    return cout.rdbuf(0);
}
int i = foo();

int main()
{
    cout << "Love" << endl;
}



5> Mehrdad Afsh..:

像这样:

#include 
int main() {
   std::cout << "I Love You" << std::endl;
   return 0;
}

/*
#include
void main()
{
    cout<<"Love";
}
*/

这样一来,你没有改变任何东西 main.:-P


糟糕的回答,一点都不好笑.如果一个2或3位数的声誉持有者发布了这个答案,他会得到-10.这对你来说是双重标准!:-)

6> whacko__Crac..:

我们也可以这样做:

#include 
#include 
using namespace std;

int fnfoo(int inum){
   cout << "I Love You" << endl;
   return (exit(0),inum);
}

int dummy = fnfoo(5);

int main()
{
   cout << "Love" << endl;
}

简单而且工作完美;)

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有