问题描述
|
我的一个朋友告诉我,这段代码有一些问题:
#include <iostream>
#include <cstdio>
using namespace std;
#define cout printf
int main(){
cout(\"cout\");
}
他没有给我原因,请我弄清楚我无法做到的原因。该代码似乎运行良好,可能是什么问题?
解决方法
据我所知,标准禁止定义在任何标准库头文件中声明的名称(使用#define)。
在n3290($ 17.6.4.3.1)中找到了
17.6.4.3.1宏名称[macro.names]
1包含标准库头的翻译单元不得在任何标准库头中声明的#define或#undef名称。
,虽然您可能会认为此代码“似乎工作正常”,但是当您的7行源文件是7百行源文件并且不是唯一的维护者时,请考虑几年。
您已经从在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<<’
整个世界的痛苦!
,是。有问题。
由于它是C ++,因此可能习惯性地写cout << 1000
,在这种情况下会出错,但在C ++中这是非常正常的。
接下来是什么?您是否要定义以下内容:
#define scanf cin
//so that you can use it as
scanf >> variable; //not so kewl.
我的建议是:
不要尝试更改此类名称的含义。毕竟,您将从中得到什么?没有。
,遇到了维护问题,因为您需要重新定义知名功能才能以不同的方式工作。因此,没有其他程序员愿意使用此代码。
类似:
#define MULTIPLY(a,b) (a + b)
#define FIVE 12
#define THREE 3
int main(void)
{
return MULTIPLY(FIVE,THREE);
}
它给出了正确的答案,但完全无法维持。
,您已将main
声明为返回int
,但未包含return
语句。您应在main
函数的末尾添加return 0;
。在C ++中,您不必将ѭ7的值减去ѭ9的值,但这是很好的样式。
哦,别#define cout printf
,真是令人困惑。从技术上讲,这可能不是非法的,但对于以后再尝试维护您的代码的人来说,这并不是一件好事。