1

私は C++ で単純なスタック プログラムを開発していました。

#include<iostream>
#define MAX 3;
using namespace std;

class stack
{
private:
    int arr[3];
    int top;

public:
    stack()
    {
        top=-1;
    }
    void push(int item)
    {
        if(top==MAX-1)
        {
            cout<<endl<<"STACK FULL";
            return;
        }
        top++;
        arr[top]=item;
        cout<<endl<<"Pushed "<<item;
    }
    int pop()
    {
        if(top==-1)
        {
            cout<<endl<<"STACK EMPTY";
            return NULL;
        }
        int temp=arr[top];
        top--;
        return temp;
    }
};

int main()
{
    stack s;
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(4);

    cout<<endl<<"Popped "<<s.pop();
    cout<<endl<<"Popped "<<s.pop();
    cout<<endl<<"Popped "<<s.pop();
    cout<<endl<<"Popped "<<s.pop();
}

そしてこれをお土産に頂きました

naveen@linuxmint ~/Desktop/C++ $ g++ stack.cpp -o stack
stack.cpp: In member function ‘void stack::push(int)’:
stack.cpp:18:11: error: expected ‘)’ before ‘;’ token
stack.cpp:18:16: error: expected ‘;’ before ‘)’ token
stack.cpp: In member function ‘int stack::pop()’:
stack.cpp:32:11: warning: converting to non-pointer type ‘int’ from NULL [-Wconversion-null]

削除# define MAX 3してreturn NULLもエラーが発生しません。エラーが発生するのはなぜですか?

4

2 に答える 2

19

をラインから削除;しますdefine MAX 3 ;。それは次のように展開されます

if(top==3 ;-1)

これは間違いなくあなたが望むものではありません。#defineこれは C ステートメントではなく、プリプロセッサ ディレクティブであることを忘れないでください。

#defineおそらくさらに良いアイデアは、次のようなものを使用するのではなく、定数に変更することです

static const unsigned MAX = 3;

これにより、すべてのプリプロセッサが完全に回避されます。

于 2013-08-12T14:54:52.767 に答える
12

で定数を定義するのは得策ではありません#define

#define MAX 3;に変更#define MAX 3

これに関する関連記事: -マクロ定義をセミコロンで終わらせないでください

代替案は次のとおりです。

static const unsigned MAX = 3;
于 2013-08-12T14:54:53.520 に答える