2017-11-28 3 views
-1

이 문제는 MacOS에서만 나타나는 것으로 보이며, clang을 사용하여 Linux에서도 문제가 없습니다.MacOS에서 Clang 컴파일 오류가 발생했습니다

clang++ -std=c++11 main.cpp -o test 

:이 사용 된 컴파일러 인수했다

main.cpp:2:5: error: redefinition of 'index' as different kind of symbol 
int index = 0; 
    ^
/usr/include/strings.h:73:7: note: previous definition is here 
char *index(const char *, int) __POSIX_C_DEPRECATED(200112L); 
     ^
main.cpp:5:18: warning: address of function 'index' will always evaluate to 
     'true' [-Wpointer-bool-conversion] 
    std::cout << index << std::endl; 
       ~~ ^~~~~ 
main.cpp:5:18: note: prefix with the address-of operator to silence this warning 
    std::cout << index << std::endl; 
       ^
       & 
1 warning and 1 error generated. 

:

다음 코드

#include<iostream> 
int index = 0; 
int main() 
{ 
    std::cout << index << std::endl; 
} 

컴파일에 오류가 발생, 단순화하지만 문제를 보여줍니다 stdio로 iostream을 제거하거나 코드가 예상대로 컴파일되지 않습니다. 이 문제를 해결할 수있는 방법인가요? 또는이를 피하기 위해 변수 이름을 변경해야합니까?

나는 this을 찾았지만 이미 C++ 11 플래그를 사용하고 있으며 -std = c11 플래그가 C++ 코드에 유효하지 않은 것으로 보입니다.

+1

왜 컴파일이 기대 되나요? – juanchopanza

+0

'index'는 무엇이라고 생각하십니까? –

+1

분명히 코드를 다시 타이핑하고 있습니다. 그렇게하지 마십시오. 복사하여 붙여 넣기를 사용하여 게시하십시오. –

답변

1

사용중인 clang/xcode의 특정 버전은 <iostream>을 포함 할 때 <strings.h> 헤더를 포함합니다. <strings.h>은 전체 범위에서 index()이라는 기능을 제공합니다. 따라서 동일한 이름의 전역 범위에서도 변수를 선언 할 수 없습니다.

어느하면 변수 이름을 바꾸거나 main()로 이동 : 변수가 다른 것 같은 식별자를 가지고 있지만 다른 범위에있을 때, 그것은 완전히 다른 개체로 간주되기 때문에

#include <iostream> 

int main() 
{ 
    int index = 0; 
    std::cout << index << std::endl; 
} 

이 작동합니다.

#include <iostream> 

int myVar = 0; 

int main() 
{ 
    int myVar = 1; 
    std::cout << myVar << '\n'; 
    std::cout << ::myVar << '\n'; 
} 

이 인쇄됩니다 :

1 
0 

myVar 로컬 변수를 참조하기 때문에,하지만 하나 ::myVar에서

당신에게 작품을,이 코드를 고려 방법에 대한 예제를 제공합니다 글로벌 범위.

+0

strings.h를 포함하지 않는 버전 또는 Xcode/clang이 있습니까? 검색 결과에서 Mac의 기본 헤더와 비슷한 것으로 나타났습니다. 현재 Apple LLVM 버전 9.0.0 (clang-900.0.38)을 사용 중입니다. –

+0

@ErikW 잘 모르겠 음. 어쨌든, 그것은 당신이 통제 할 수있는 것이 아닙니다. 따라서 다른 이름을 사용하거나 변수를 다른 범위로 이동하거나 Caleb가 지적한 네임 스페이스를 다른 대답으로 사용하십시오. –

0

이 문제를 해결하는 방법이 있습니까? 아니면이를 피하기 위해 변수 이름을 바꾸어야합니까?

C++은 이름 간의 충돌을 피하기 위해 특별히 네임 스페이스를 제공합니다. 변수에 대해 하나를 만들 수 있습니다.

#include<iostream> 

namespace MyGlobals { 
    int index = 0; 
} 

int main() 
{ 
    std::cout << MyGlobals::index << std::endl; 
} 
관련 문제