#defining cout中的问题?

时间:2011-05-25 17:50:33

标签: c++

我的一位朋友告诉我这段代码存在一些问题:

#include <iostream>
#include <cstdio>
using namespace std;
#define cout printf   
int main(){
    cout("cout");
}

他没有告诉我原因,并让我弄清楚哪些我不能。代码似乎工作正常,它可能有什么问题?

5 个答案:

答案 0 :(得分:11)

据我所知,标准禁止在任何标准库头中声明名称(使用#define)。

在n3290($ 17.6.4.3.1)

中找到了这个
  

17.6.4.3.1宏名[macro.names]

     

1包含标准库头的翻译单元不得在任何标准库头中声明#define或#undef名称。

答案 1 :(得分:2)

是。它有问题。

由于它的C ++,可能习惯性地cout << 1000这在这种情况下会出错,但在C ++中这是非常正常的。

下一步是什么?你想要定义这个:

#define scanf cin

//so that you can use it as
scanf >> variable; //not so kewl.

我的建议是:

不要试图改变这些名字的含义。毕竟,这样做会得到什么?什么都没有。

答案 2 :(得分:2)

虽然您可能会认为此代码“似乎工作正常”,但是当您的7行源文件是一个700行的源文件并且您不是唯一的维护者时,请考虑几年后。< / p>

您已经开始在C ++源文件中编写C风格的printf语句,并添加(或其他维护者添加)以下完全有效的C ++ 行:

    cout << "What is wrong with my perfectly valid C++ code? " << endl;

您的编译器报告:

test.cpp:699: error: invalid operands of types ‘int ()(const char*, ...)’ and ‘const char [29]’ to binary ‘operator<<’

痛苦的整个世界!

答案 3 :(得分:1)

它存在维护问题,因为您重新定义了众所周知的功能,以便以不同的方式工作。所以没有其他程序员想要处理这段代码。

类似:

#define MULTIPLY(a, b) (a + b)

#define FIVE 12
#define THREE 3

int main(void)
{
    return MULTIPLY(FIVE, THREE);
}

它给出了正确答案,但完全无法维护。

答案 4 :(得分:0)

您已将main声明为返回int,但未包含return声明。您应该在return 0;函数的末尾添加main在C ++中,您不必return来自main的值,但它很好风格。

哦,不要#define cout printf,这真的令人困惑。它在技术上可能不是非法,但是对于后来试图维护代码的人来说并不好。