【问题标题】:can #define be used for printing information?#define 可以用于打印信息吗?
【发布时间】:2013-07-26 05:31:17
【问题描述】:

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

【问题讨论】:

  • 如果你要将它们分开,你需要告诉它下一行是它的一部分。
  • 没有理由使用宏。应该使用一个函数。如果需要,数据类型可以是模板参数。

标签: c++ preprocessor-directive


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

【讨论】:

  • 当然。我真的不能强调你应该如何避免使用宏,除非你必须这样做。想想如果你写类似 PRINT(Data, x++) 会发生什么。您希望 ++ 只会出现一次,而实际上每次在宏中使用 N 时都会发生。
【解决方案2】:

如果你正确定义它就可以使用它。 但是 ....仅仅因为可以使用,难道就意味着应该使用。

使用std::copy_n:

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

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

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

【讨论】:

  • 是的,绝对是一个更好的解决方案。它可以很容易地适应格式。
【解决方案3】:

这不是你想使用宏的东西。

写一个模板函数来做同样的事情:

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

你真的应该避免使用宏。我发现您需要宏的唯一原因是当您需要使用输入名称(作为字符串)或位置(LINEFILE)时,例如:

#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; 

这是一个没有宏就无法实现的功能。没有宏你应该做的任何事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多