#定义线索的问题?

问题描述

| 我的一个朋友告诉我,这段代码有一些问题:
#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
,真是令人困惑。从技术上讲,这可能不是非法的,但对于以后再尝试维护您的代码的人来说,这并不是一件好事。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...