#define可用于打印信息吗?

时间:2013-07-26 05:31:18

标签: c++ preprocessor-directive

我遇到了一个我不理解的陈述。请有人解释一下。 它是一个对数据进行排序的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;

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

如果您正确定义它,可以使用它。 ....只是因为可以使用意味着它应该被使用。

使用std::copy_n

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

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

或者写一个正确的功能 )以您自己定义的格式打印。优选地,具有beginend作为函数参数的函数模板。看看标准库中的算法如何工作和实现。这将有助于您提出一个良好的代码通用设计。探索并试验库通用函数!

答案 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; 

如果没有宏,这是一项功能。没有你应该做的任何你可以做的事情