c ++中#define的实用程序

时间:2011-03-12 20:08:47

标签: c++

嘿,伙计们! 我刚刚通过读取文件中的值来从c ++中添加矩阵的教程中找到了这段代码? 我想问一下#define在这里做了什么?有什么特别之处呢?它与主要分别声明M和N为int或char有何不同? 提前致谢! 的

#include <iostream>
#include <fstream>
using namespace std;

#define M 4
#define N 5

void matrixSum (int P[M][N], int Q[M][N], int R[M][N]);
void matrixSum (int P[M][N], int Q[M][N], int R[M][N]) {
 for (int i=0; i<M; i++)    // compute C[][]
  for (int j=0; j<N; j++) 
    R[i][j] = P[i][j] + Q[i][j];
}

int main () {

 ifstream f;
 int A[M][N];
 int B[M][N];
 int C[M][N];

    f.open("values");   // open file

    for (int i=0; i<M; i++)     // read A[][]
      for (int j=0; j<N; j++) 
        f >> A[i][j];   

    for (int i=0; i<M; i++)     // read B[][]
      for (int j=0; j<N; j++) 
        f >> B[i][j];

    matrixSum (A,B,C);      // call to function

    for (int i=0; i<M; i++) {   // print C[][]
      for (int j=0; j<N; j++) 
        cout << C[i][j] << " ";
      cout << endl;
    }
    f.close();
}

4 个答案:

答案 0 :(得分:3)

#define和以#开头的其他命令是在编译开始之前由C预处理器运行的命令。

具体来说,#define告诉预处理器,令牌M出现的地方,应该使用文本“4”。你是正确的,使用正常的变量定义是完成相同功能的首选方式。变量定义的原因是编译器使用其余代码处理,而#defines涉及编译之前的步骤。更复杂的#defines会导致非常困难和混乱的编译器错误。如果#define出现问题,那么使用#define的行会列出错误(因为代码是在编译之前复制粘贴的),而不是#define的行。不过,你会看到很多旧的C风格代码用#defines定义常量。

答案 1 :(得分:3)

const int M = 4;const int N = 5;的想法使得作者因为高达 8字节的内存而在他的靴子中动摇,所以他使用#define代替。

答案 2 :(得分:2)

作为旁注,使用功能模板是一个更通用的解决方案:

template<size_t M, size_t N>
void matrixSum (int (&P)[M][N], int (&Q)[M][N], int (&R)[M][N]);

template<size_t M, size_t N>
void matrixSum (int (&P)[M][N], int (&Q)[M][N], int (&R)[M][N])
{
  for (int i=0; i<M; i++)   
    for (int j=0; j<N; j++) 
       R[i][j] = P[i][j] + Q[i][j];
}
int main () 
{

 const int M = 4; //now in main!
 const int N = 5;

 ifstream f;
 int A[M][N];
 int B[M][N];
 int C[M][N];

 //same as before
}

我认为这比使用#define更好,因为使用constenum有助于调试。更详细的解释如下:

C++ - enum vs. const vs. #define

答案 3 :(得分:0)

它是

形式的预处理程序指令
#define identifier token-sequence

预编译器在编译器转换代码之前运行,以便在编译器中使用。订单如下:

  • Trigraph replacement
  • 线拼接
  • 宏定义和扩展

所以使用#define你可以进行角色操作(宏替换)。

每当看到M时,4将被替换。

编译器将看到

 void matrixSum (int P[4][5], int Q[4][5], int R[4][5]);  // ..etc

另一种方法是在全局变量上使用const限定符。

在C中,它将是

// Some fileA.c  
const int M; // initialize

// Some fileB.c
const int M = 4; // defined

所以我想说尽可能避免因为宏是文本替换的一种形式,它们不遵守范围和类型规则。