#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();
}
答案 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
更好,因为使用const
或enum
有助于调试。更详细的解释如下:
答案 3 :(得分:0)
它是
形式的预处理程序指令#define identifier token-sequence
预编译器在编译器转换代码之前运行,以便在编译器中使用。订单如下:
所以使用#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
所以我想说尽可能避免因为宏是文本替换的一种形式,它们不遵守范围和类型规则。