我的一位朋友告诉我这段代码存在一些问题:
#include <iostream>
#include <cstdio>
using namespace std;
#define cout printf
int main(){
cout("cout");
}
他没有告诉我原因,并让我弄清楚哪些我不能。代码似乎工作正常,它可能有什么问题?
答案 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)
您已将在C ++中,您不必main
声明为返回int
,但未包含return
声明。您应该在return 0;
函数的末尾添加main
。return
来自main
的值,但它很好风格。
哦,不要#define cout printf
,这真的令人困惑。它在技术上可能不是非法,但是对于后来试图维护代码的人来说并不好。