2017-11-25 1 views
-1

저는 Mac에서 C++을 배웠고 최근에 Windows 7로 이전했습니다. Windows v7.1 sdk를 다운로드하고 설치 프로그램을 실행했습니다. 자사의 닷넷 4 종속 버전의 sdk 및 .net 4 설치되어 있습니다.컴파일러가 논리적이고 정의되지 않은 식별자입니다.

나는 그것을 사용하는 것이 더 좋기 때문에 커맨드 라인을 사용하고있다. 나는 맥에서 gcc 컴파일러를 사용했기 때문에 프로그래밍에 익숙하다고 생각하기에 꽤 좋다.

나는 SetEnv 배치 파일을 사용하여 환경 변수를 설정하기 때문에 v7.1 sdk 개발자 명령 프롬프트를 사용하고 있습니다.

컴파일러는 분명히 Microsoft의 cl.exe 컴파일러입니다.

나는 프로그램이 실제로 보일 수 있도록 getchar()를 포함하여 전형적이고 매우 간단한 hello world 프로그램을 돌렸고, mac은 그것을 요구하지 않았기 때문에 새로운 것이었다. 그리고 getchar는 잘 작동했고, 프로그램은 컴파일되어 잘 돌아갔다.

내가 Mac에서 쓴 몇 가지 소스 코드를 컴파일 할 때 문제가 발생했습니다. 그런데 Mac에서 벌금을 벌었습니다. 그것은 논리적 인 'and'연산자가 정의되지 않은 식별자라는 것을 알려주는 것과 같은 정말 이상한 오류를 던지기 시작했습니다. 이제 저는 여기 바보 같은 사람이 될 수 있습니다. 그러나 제 이해력에서와 연산자는 식별자가 아니며 연산자입니다.

그래서 나는 하나의 if 문과 하나의 else 문과 'and'연산자를 사용하는 매우 간단한 프로그램을 작성하고 어떤 일이 일어나는지를 보면서 문제의 범위를 좁히기로 결정했습니다. 아래는 제가 컴파일을 시도하는 코드입니다 :

//hello, this is a test 

#include <iostream> 

int main() 

{ 

    char end; 
    int a = 0, b = 0; 

    std::cout << "If the variable a is larger than 10 and variable b is less than a, then b will be subtracted from a, else they are added.\n"; 
    std::cout << "Enter a number for variable a\n"; 
    std::cin >> a; 
    std::cout << "Now enter a number for variable b\n"; 
    std::cin >> b; 

    if (a>10 and b<a) a - b; 
    else a+b; 
    std::cout << "The value of a is: " <<a; 

    std::cout << "Press any key to exit"; 
    end = getchar(); 
    return 0; 
} 

는 그리고 이것은 확실히이 그 오류의 목록이 아니라 적어도 내가

cl /EHsc main.cpp 

그리고 마지막으로 프로그램을 컴파일하는 데 사용되는 명령입니다 만 프로그램 제기, 왜 이러한 오류가 여기 있는지 확실하지 않습니다. 그것은 나에게 어떤 의미가 없습니다.

MAIN.CPP 이러한 오류의

error C2146: syntax error : missing ')' before identifier 'and' 

error C2065: 'and' : undeclared identifier 

error C2146: syntax error : missing ';' before identifier 'b' 

error C2059: syntax error : ')' 

error C2146: syntax error : missing ';' before identifier 'a' 

warning C4552: '<' : operator has no effect; expected operator with side-effect 

warning C4552: '-' : operator has no effect; expected operator with side-effect 

error C2181: illegal else without matching if 

warning C4552: '+' : operator has no effect; expected operator with side-effect 

모든 마지막은 이상한입니다. 나는 결코 전에 그것을 만난 적이 없다. 그리고 나는 결코 묻지 않고 내 대답을 찾을 수 있었기 때문에 나는 전에 한 번도 질문하지 않았다. 그러나이 질문에서 나는 정말로 난처한 상황에 처해있다.

+2

'a + b'와'a-b'는 두 변수를 더하거나 뺍니다. 그러나 결과는 아무 것도하지 않습니다. 결과를 변수에 저장하거나 함수 호출로 전달하는 것과 같은 부작용이없는 명령문이므로 프로그램 흐름에 영향을 미치지 않습니다. 실제로 컴파일러는 프로그램의 존재 유무가 프로그램에 전혀 영향을 미치지 않으므로 프로그램에서 완전히 제거 할 가능성이 높습니다. – Frxstrem

+2

이 방법을 잘못 사용하지 마십시오.하지만 문제를 설명하기 위해 긴 설명이 필요하지 않습니다. 게시물의 정보 대 소음 비율이 그다지 좋지는 않습니다. – StoryTeller

+0

당신은 그것을 깨닫고 && C++에서? 이 코드가 Mac에서 컴파일 된 경우 실제로 컴파일러가 연결되어 있습니다. – anhoppe

답변

5

이 마이크로 소프트 비주얼 C++ 컴파일러의 버그 (기능) - 그것은 키워드 and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor을 지원하지 않습니다, xor_eq. 대신 매크로의 세트 헤더 <iso646.h>을 제공

C++과는 달리
+--------+-------+ 
| and | && | 
| and_eq | &= | 
| bitand | & | 
| bitor | | | 
| compl | ~ | 
| not | ! | 
| not_eq | != | 
| or  | || | 
| or_eq | |= | 
| xor |^ | 
| xor_eq | ^= | 
+--------+-------+ 

, C가 해당 키워드를 제공하지 않습니다 대신 or 등 등가 테이블의 ||&& 대신 and처럼 일반적으로 사용되는 연산자를 사용한다 이러한 논리 연산자로 확장되는 이름이 있습니다. 과거에 키보드에 필요한 문자가없는 기계를 지원하기 위해 수행되었습니다.

C++은 매크로를 가능한 한 많이 사용하지 않으므로 C++ 헤더에 해당하는 <ciso646>은 매크로를 정의하지 않으며 대신 내장 키워드로 제공됩니다.

여기서 언급했듯이 최신 버전의 MSVC가 이에 대한 지원을 추가 할 수 있지만 "altenative operators"는 거의 사용되지 않습니다. 원본 C 구문을 사용하는 것이 좋습니다.

+0

하하, 나는 마약이야. 나는 컴파일러가 아무 이유없이 가발을하기로 결정했다고 생각했다. 나는 연산자를 정의하는 표준 방법을 시도해야한다고 생각 했어야했다. 또한 게시 한 후에 코드에서 엉망이 된 것을 발견했습니다. if 및 else 문을 기반으로 한 값을 업데이트 한 적이 없었습니다. "운영자는 아무런 영향을 미치지 않습니다"라는 오류가 설명됩니다. 재밌는 점은 이전에 내 프로그램에서 한 적이 없다는 것입니다. 그리고 나는 그 오류를 지적하는 누군가를 알아 차렸다. 내가 그것을 놓쳤다는 것을 믿을 수 없어, 그것을 여기에 게시했다. 오 글쎄, 너는 겸손 해. – JoshD

+0

@ JoshD 답변으로 문제가 해결되면 수락해야합니다. – tambre

+0

감사합니다. 스택 오버플로를 처음 사용한다고 말할 수 있듯이 토론을 종료하거나 해결 된 것으로 표시하는 방법을 찾으려고했습니다. 그리고 나서 당연히 제 관심을 요구하는 다른 것을해야했습니다. 나는 그것을 알아 냈으므로 다시 질문 할 필요가 있다면 대답을 받아들이는 방법을 알게 될 것입니다. – JoshD

1

이러한 alternative operators은 Visual C++ 구현에서 매크로로 <iso646.h> 헤더에 정의되어 있습니다. 그들은 다른 사람들과 C++ 언어로 만들어졌습니다.

#include <iso646.h> 

또는 카메라 C++ 컴파일러 사용시 /permisive- 컴파일러 스위치 컴파일 하나가이 헤더를 포함한다. Permissive compiler switch GCC로 컴파일 할 때 위의 헤더를 포함 할 필요가 없습니다.

같은 단어 매크로와 같은 포함 파일 <iso646.h>의 C 프로그래밍 언어에 정의되어 있습니다 GCC는 구현 내용의 alternative operators representation 기준을 존중하는 것 같다.C++에서는 언어에 내장되어 있으므로 <iso646.h>의 C++ 버전과 <ciso646>은 아무 것도 정의하지 않습니다.

Live example on Coliru

+0

이들은'permissive-'컴파일러 스위치로 정의됩니다. 이것은 VS의 차후 버전에서 디폴트가 될 것이고 솔직히, 모든 새로운 프로젝트를 위해 켜져 있어야합니다. –

+0

@Revolver_Ocelot 귀하의 의견대로 답변을 업데이트했습니다. – Ron

+0

실제로 C 언어 대신 [cppreference 페이지] (http://en.cppreference.com/w/cpp/language/operator_alternative)의 C++ 버전에 연결해야합니다. – tambre