Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 定义是否可用于打印信息?_C++_Preprocessor Directive - Fatal编程技术网

C++ 定义是否可用于打印信息?

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

我遇到了一个我不明白的陈述。谁能给我解释一下吗。 它是一个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::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;