2010-02-13 3 views
6

그래서 간단한 C++ 연습을하고 있었는데 흥미로운 위업을 발견했습니다. 맥스 OS X에서 ++ 일반 g을 사용하고 있었다C++의 "nice"키워드는 무엇입니까?

<file>.cpp: In function ‘int main()’: 
<file>.cpp:11: error: expected `;' before ‘n’ 
<file>.cpp:11: warning: statement is a reference, not call, to function ‘nice’ 
<file>.cpp:11: warning: statement has no effect 

그리고이 :

class nice 
{ 
    public: 
    nice() {} 
}; 

int main() 
{ 
    nice n; 
    return 0; 
}; 

결과는 이런 식 컴파일 오류는 다음 코드를 컴파일 시도 할 수 베어 메탈 일까지 삶은 , 일부 친구들은 우분투에서 시도해 보았습니다. 동일한 결과를 얻었습니다.

위업은 리팩토링으로 컴파일 할 수 있기 때문에 단어 "nice"에있는 것처럼 보입니다. 이제는 C++이나 C의 키워드 목록에서 '멋진'단어를 찾을 수 없으므로 여기에 누구나 아이디어가 있는지 궁금합니다. 대신

nice n; 

수정 문제

class nice n; 

퍼팅 또한

.

P. 필자는 친숙한 C++ 초보자이며 ActionScript/.NET/Java/Python 세계에서 왔습니다.

업데이트 : 그것없이 모든 것이 잘 작동하기 때문에

오른쪽, 내 나쁜, 나는 또한, 문제의 근본 것으로 보인다 상단에서

#include <iostream> 

했다.

+0

문제의 근원은'#include '이 아니지만'using namespace std'입니다! – James

+0

@Autopulated - 네임 스페이스 표준이라고 생각하지 않습니다. 글로벌 네임 스페이스와의 충돌입니다. 인데, :: nice()와 충돌합니다. – Duck

+0

많은 사람들이 말한 것처럼 "std"네임 스페이스 인 것처럼 들립니다. 일단 당신이 그 사실을 확인했다면, 그 답 중 하나를 대답이 아닌 "수락"(녹색 체크 표시)으로 표시하십시오. – MatrixFrog

답변

3

네임 스페이스에 문제가 있지만 이 아니고 네임 스페이스 std가 있어야합니다. 당신은 아무 문제가없는

class nice 
{ 
    public: 
     nice() {}; 
}; 

int main(int argc, char *argv[]) 
{ 
    nice n; 

    return 0; 
} 

을하려고하면 헤더 <iostream><unistd.h>

당기는된다.

단순히

#include <unistd.h> 

추가하고 당신은 얻을 것이다 "예상 ';' 'n'을하기 전에"오류. 네임 스페이스 std가 그림을 입력하지 않습니다.

그래서 해결책은 이전의 클래스와 똑같은 자체 네임 스페이스에 nice이며 global :: nice()와 충돌하지 않습니다.

2

나를 위해 잘 작동합니다. 게시 한 정확한 코드를 사용해 보셨습니까?

+1

맞아요, 아니, #include 맨 위에 :) 아마도 그 것 같습니다. – oleks

17

어쩌면 libc에있는 nice 함수가 원인 일 수 있습니다. 수업 이름을 printf으로 지정하는 것과 비슷합니다.

4

using namespace std 언제든지?

편집 :

표준은 표준 헤더 std 네임 스페이스에있는 모든 문자 (17.4.1.2.4 참조) 정의 말한다.

#include <iostream> 

namespace test 
{ 
    class nice 
    { 
    public: 
     nice() {} 
    }; 
}; 

using namespace std; 

int main() 
{ 
    test::nice n; 
    cout << "well I think this works." << endl; 
    return 0; 
} 

에서 :

+0

각주는 ''변형을 의미합니다. C에서 상속받은 것들이다. ISO C++에는 ''의 .h 변형이 없다. 그러나 구현시 머리글 이름 은 ISO C++ – MSalters

+0

에 의해 예약되지 않았으므로 @MSalters yes, 정확히 : 은 c 헤더가 아니므로 * 모든 * 기호를 전역 이름 공간에 두지는 않습니다. – James

3

이 버전을보십시오);하지만, 물론 아무도이를 사용해서는 안 - 는 각주는, 그러나, 또한 < .H> 변종 전역 네임 스페이스에 자신의 이름을 덤프 말한다 이 경우 내 자신의 네임 스페이스 test을 정의했습니다. 그렇게하면, 이미 정의 된 함수 (예 : printf)를 포함하여 내가 좋아하는 클래스 이름을 사용할 수 있습니다. 재사용 할 수없는 유일한 단어는 int 또는 namespace과 같은 예약어입니다.

참고 : 당신이 말한다면 :뿐만 아니라

using namespace test; 

을 혼자 nice을 참조,이 오류가 발생합니다 :

내가 무슨 일이 일어나고 있는지 잘 설명 생각
nice.cpp: In function ‘int main()’: 
nice.cpp:18: error: reference to ‘nice’ is ambiguous 
/usr/include/unistd.h:593: error: candidates are: int nice(int) 
nice.cpp:7: error:     class test::nice 

- 좋은 지금 두 개의 네임 스페이스에 존재하며 컴파일러는 어떤 것을 의미하는지 알 수 없습니다.

+0

궁금한 분이 계시다면 (예전처럼) std :: nice() 함수에 대한 정보는 다음과 같습니다. http://www.gnu.org/software/libc/manual/html_node/Traditional-Scheduling-Functions.html# Traditional-Scheduling-Functions (맨 아래로 스크롤) – MatrixFrog

+0

네, niceness는 리눅스 커널이 스케쥴링을 위해 사용하는 값입니다. 그게 내가하는 일이야. –

+0

nice()는 std에서 * not *이며 전역입니다. – Duck