C++ 定义是否可用于打印信息?
我遇到了一个我不明白的陈述。谁能给我解释一下吗。 它是一个C++程序来对数据进行排序。p>C++ 定义是否可用于打印信息?,c++,preprocessor-directive,C++,Preprocessor Directive,我遇到了一个我不明白的陈述。谁能给我解释一下吗。 它是一个C++程序来对数据进行排序。p> #define PRINT(DATA,N) for(int i=0; i<N; i++) { cout<<"["<<i<<"]"<<DATA[i]<<endl; } cout<<endl; #为(int i=0;i定义打印(数据,N)如果您正确定义它,它可以使用。但是…仅仅因为它可以使用,不就意味着应该使用它 使用std::c
#define PRINT(DATA,N) for(int i=0; i<N; i++) { cout<<"["<<i<<"]"<<DATA[i]<<endl; } cout<<endl;
#为(int i=0;i定义打印(数据,N)如果您正确定义它,它可以使用。但是…仅仅因为它可以使用,不就意味着应该使用它
使用std::copy\n
:
std::copy_n(data, n, std::stream_iterator<X>(std::cout, " "));
std::copy_n(数据,n,std::流迭代器(std::cout,”);
这将把n
项从data
打印到stdout,每个项之间用空格隔开。请注意,在上述代码中,X
是data[i]
的类型
或编写适当的函数(非宏)以您自己定义的格式打印。最好是一个函数模板,其中包含begin
和end
作为函数参数。看看标准库中的算法是如何工作和实现的。这将帮助您对代码进行良好的通用设计。探索并实验库通用函数!
这是一个宏,每次写入PRINT(DATA,N)时,预处理器都会将其替换为整个for循环,包括变量
每行末尾缺少\符号。这表明宏将继续到下一行。(查看
如果使用宏,请在任何变量(DATA)和(N)周围使用括号。替换为文字,这将允许使用诸如PRINT(DATA,x+1)之类的用法,否则会导致意外结果
除非您真的必须使用宏,否则不要使用宏。这可能会导致许多问题,它没有作用域等等。您可以编写一个内联方法,或者像Nawaz建议的那样使用std::copy\n
这不是您想要使用宏来实现的
编写一个模板函数,该函数执行完全相同的操作:
template<typename T>
void PRINT(const T &data, size_t n){
for (size_t i=0;i<n;++i)
cout << "["<<i<<"]"<<data[i]<<endl;
}
这是一个没有宏就无法实现的功能。如果要拆分,则需要告诉它下一行是它的一部分。@neodev如下:没有理由使用宏。应该使用函数。如果需要,数据类型可以是模板参数。是的,肯定是更好的解决方案。它可以很容易地调整以匹配格式。当然。除非必须,否则我真的无法强调您应该如何避免使用宏。想想如果您编写类似于PRINT(Data,x++)的内容会发生什么。您希望++只出现一次,而事实上每次在宏中使用N时都会出现。
template<typename T>
void PRINT(const T &data, size_t n){
for (size_t i=0;i<n;++i)
cout << "["<<i<<"]"<<data[i]<<endl;
}
#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;