2012-09-17 3 views
0

저는 C++에서의 경험이 있지만 최근에는 직장에서 독점적으로 파이썬을 사용하고 있었고 저는 매우 녹슬 었습니다. 각 파일은 아래에 나열되어,C++ 스택 구현 HW 오류

a.out : main.o stack.o 
    gcc -o a.out main.o stack.o 

main.o : main.cpp stack.h 
    gcc -O -c main.cpp 

stack.o : stack.h 
    gcc -O -c stack.h 

clean : 
    rm main.o stack.o 

그래서

MAIN.CPP

#include "stack.h" 

int main(int argc, char** argv){ 
    return 0; 
} 

stack.h

#ifndef STACK_H 
#define STACK_H 

#define NULL 0 

template <class elementType> 
class stack{ 

    struct node 
    { 
     elementType data; 
     node* next; 
    }; 

    node* top; 

public: 

    stack(){ 
     top = NULL; 
    } 

    ~stack(){ 
     node temp = top; 
     while (top != NULL){ 
      top = top->next; 
      delete temp; 
     } 
    } 

    void push(elementType x){ 
     node temp = new node(); 
     temp.data = x; 
     temp.next = top; 
     top = temp; 
    } 

    elementType pop(){ 
     node temp = top; 
     top = top->next; 
     return temp; 
    } 

    bool isEmpty(){ 
     return top == NULL; 
    } 
}; 

#endif //STACK_H 

메이크 때 프로젝트 디렉토리 및 유형의 I cdmake 도착 :

gcc -O -c main.cpp 
gcc -O -c stack.h 
stack.h:7:10: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘<’ token 
make: *** [stack.o] Error 1 

저는 해결책을 찾고 있었지만 코드가 정확하다고 말할 수 있습니다. 나는 실제 스택 구현에 대한 도움을 찾고 싶지 않다. 그리고이 코드가 빈 메인에서 실제로 아무 것도하지 않을 것이라는 것을 알지만,이 컴파일 오류를 고칠 수 없다.

+8

g ++를 gcc가 아니라 C++로 컴파일하십시오. –

+0

@MarkLoeser는 답이되어야합니다. (올바른 것이기 때문에) :) –

답변

3

g ++를 g ++가 아닌 gcc로 컴파일하십시오. 또한 헤더를 컴파일 할 필요가 없습니다.

+0

감사합니다! 전에 makefile을 사용 해본 적이 없으며 컴파일 할 때 터미널을 사용하기까지 잠시 기다렸습니다. 어쨌든, 다시 한번 감사드립니다. – Logiraptor

2

C++에서는 헤더 파일을 컴파일하지 않고 원본 파일 만 컴파일합니다.

그리고 g ++가 아닌 g ++로 C++을 컴파일합니다.

1

gcc -c stack.cpp은 잘 작동합니다. gcc는 .cpp를 C++의 확장자로 인식하고 C++로 파일을 컴파일합니다. 문제가 발생합니다 gcc stack.h; 다른 사람들이 말했듯이 헤더를 컴파일하지 마십시오. 하지만 오류의 이유는 gcc가 C 파일이 아닌 C++로 파일을 처리하는 것으로 보입니다 (부당한 것은 아니지만 그것이 무엇을하는지 보지 못했습니다).

그러나 링크 할 때 g++을 사용하거나 적절한 C++ 런타임 라이브러리를 지정해야합니다. 여기에서 g++을 쉽게 사용할 수 있습니다.

아, stack.h에 오류가 있습니다. poptemp을 반환하지만 temp.data을 반환해야합니다.

NULL이라는 매크로를 정의 할 때주의하십시오. 표준 라이브러리의 정의와 충돌 할 수 있습니다. 코드는 표준 라이브러리의 헤더를 사용하지 않기 때문에 문제는 아니지만 인위적입니다.