g++ vs Visual Studio

g++ vs Visual Studio

本文关键字:Studio Visual vs g++      更新时间:2023-10-16

你能说说为什么Visual Studio编译这段代码(在消息末尾)很好,但g++给了我一个错误:

chapter8_1.cpp:97:50: error: macro "minor" passed 3 arguments, but takes just 1
chapter8_1.cpp:136:36: error: macro "minor" passed 3 arguments, but takes just 1
chapter8_1.cpp:97:11: error: function definition does not declare parameters
chapter8_1.cpp: In member function ‘double Matrices::determinant(double**, int)’:
chapter8_1.cpp:136:17: error: ‘minor’ was not declared in this scope

现在这两个函数在一个struct,尽管如果我不struct编译它们(只是独立的函数),那么 g++ 不会给我任何错误,程序工作正常。该程序旨在计算任何方阵的行列式。

法典:

struct Matrices
{  
.......
    double **minor(double **matrix, int dim, int row)  // row stands for the number of column that we are expanding by
    {
        int dim2 =--dim;
        double **minor2;
        minor2=new double*[dim2];                            // creates minor matrix 
        for(int i=0; i<dim2; ++i)
            minor2[i]=new double[dim2];
        for(int hhh=0; hhh<dim2; ++hhh)
            {   
                int bbb=0;
                for(int aaa=0; aaa<dim2+1; ++aaa)                  // initializing the minor matrix
                    {
                    if (aaa==row)
                        continue;
                    else
                        {
                            minor2[hhh][bbb]=matrix[hhh+1][aaa];
                            ++bbb;
                        }
                    }
                }
        return minor2;
    }
    double determinant(double **mat, int dim)
    { 
    double det=0;
    if(dim==1)
    det=mat[0][0];
    if(dim==2)
    det=mat[0][0]*mat[1][1]-mat[0][1]*mat[1][0];
    else
    {
    double ***setOFmat;                                      // pointer that points to minors
    setOFmat=new double**[dim];
    for (int ddd=0; ddd<dim; ++ddd)                         // ddd represents here the number of column we are expanding by
        setOFmat[ddd]=minor(mat, dim, ddd);
    for (int ddd=0; ddd<dim; ++ddd)                         // ddd srepresents the same here
    {
        det= det + pow(-1.0,ddd)*mat[0][ddd]*determinant(setOFmat[ddd], dim-1);    // actual formula that calculates the determinant
    }
    }
    return det;
    }

您应该更仔细地阅读错误消息:-)

chapter8_1.cpp:97:50:错误:"次要"传递了 3 个参数,但只需要 1 个参数

这意味着gcc认为minor是某种描述的宏,因此对行进行预处理:

double **minor(double **matrix, int dim, int row)

可能会很麻烦。

我会用gcc -E编译它以获得预处理器输出,这样你就可以知道:

  • 它如何破坏你的线路;和
  • 希望在哪里定义minor宏。