我遇到了一个我不理解的陈述。请有人解释一下。 它是一个对数据进行排序的C ++程序。
#define PRINT(DATA,N) for(int i=0; i<N; i++) { cout<<"["<<i<<"]"<<DATA[i]<<endl; } cout<<endl;
当我尝试以下面的格式重新排列语句时,我收到了编译错误!
#define PRINT(DATA,N)
for(int i=0; i<N; i++)
{
cout<<"["<<i<<"]"<<DATA[i]<<endl;
}
cout<<endl;
答案 0 :(得分:4)
答案 1 :(得分:3)
如果您正确定义它,可以使用它。 但 ....只是因为可以使用,不意味着它应该被使用。
使用std::copy_n
:
std::copy_n(data, n, std::stream_iterator<X>(std::cout, " "));
这将打印从n
到标准输出的所有data
项目,每个项目用空格分隔。请注意,在上面的代码中,X
是data[i]
的类型。
或者写一个正确的功能(不 宏)以您自己定义的格式打印。优选地,具有begin
和end
作为函数参数的函数模板。看看标准库中的算法如何工作和实现。这将有助于您提出一个良好的代码通用设计。探索并试验库通用函数!
答案 2 :(得分:0)
这不是你想要使用宏的东西。
编写一个完全相同的模板函数:
template<typename T>
void PRINT(const T &data, size_t n){
for (size_t i=0;i<n;++i)
cout << "["<<i<<"]"<<data[i]<<endl;
}
你应该真的避免使用宏。我找到你需要宏的唯一原因是当你需要使用输入的名称(作为字符串)或位置( LINE 或 FILE )时,例如:
#define OUT(x) #x<<"="<<x<<"; "
#define DEB std::cerr<<"In "<<__FILE__<<":"<<__LINE__<<": "
用于这样的打印:
DEB << OUT(i)<<OUT(val[i])<<OUT(some_func(val[i],3))<<endl;
将打印
In file.cc:153: i=4; val[i]=10; some_func(val[i],3)=4.32;
如果没有宏,这是一项功能。没有你应该做的任何你可以做的事情