0

我遇到了一个我不明白的声明。谁能给我解释一下。它是一个用于对数据进行排序的 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;
4

3 回答 3

4
  1. 这是一个宏,每次您编写 PRINT(DATA,N) 时,预处理器都会将其替换为整个 for 循环,包括变量。
  2. 您在每行末尾缺少 \ 符号。这告诉它宏继续到下一行。(查看C++ 中的多语句宏
  3. 如果您使用宏,请在任何变量 (DATA) 和 (N) 周围使用括号。替换是字面的,这将允许像 PRINT(data, x+1) 这样的用法,否则会导致意外结果。
  4. 除非你真的必须,否则不要使用宏,这可能会导致很多问题,它没有范围等等。您可以编写一个内联方法或使用像 Nawaz 建议的 std::copy_n
于 2013-07-26T05:36:42.793 回答
3

如果您正确定义它,则可以使用它。但是....仅仅因为它可以使用,并不意味着它应该使用。

使用std::copy_n

std::copy_n(data, n, std::stream_iterator<X>(std::cout, " "));

这会将所有n项目打印data到标准输出,每个项目都用空格分隔。请注意,在上面的代码中,Xdata[i].

或者编写一个适当的函数不是 )以您自己定义的格式打印。最好是带有beginend作为函数参数的函数模板。看看标准库中的算法是如何工作和实现的。这将帮助你为你的代码提出一个好的通用设计。探索和试验库通用函数!

于 2013-07-26T05:33:06.923 回答
0

This isn't something you want to use a macro for.

Write a template function that does the exact same thing:

template<typename T>
void PRINT(const T &data, size_t n){
    for (size_t i=0;i<n;++i)
        cout << "["<<i<<"]"<<data[i]<<endl;
}

You should really avoid using macros. The only reason I find you NEED macros is when you need to use the name of the input (as string), or location (LINE or FILE) e.g.:

#define OUT(x) #x<<"="<<x<<"; "
#define DEB std::cerr<<"In "<<__FILE__<<":"<<__LINE__<<": "

for use in printing like this:

DEB << OUT(i)<<OUT(val[i])<<OUT(some_func(val[i],3))<<endl;

Which will print

In file.cc:153: i=4; val[i]=10; some_func(val[i],3)=4.32; 

This is a functionality you can't do without macros. Anything you CAN do without macros you SHOULD

于 2013-07-26T05:51:28.983 回答