2012-11-01 2 views
2

인터뷰 질문이 자주 묻습니다. 그러나 나는 다른 웹 사이트에서 발견 한 설명으로는 분명하지 않다. 왜냐하면,이 코드를 실행하려고 할 때 _AX 선언되지 않은 오류가 표시되기 때문입니다.psuedo의 글로벌 변수

main() 
    { 
    int i; 
    i = abc(); 
    printf("%d",i); 
    } 
    abc() 
    { 
    _AX = 1000; 
    } 

명는 출력 1000에게 보여주고 그 이유는, _AX의사 전역 변수 말합니다.

* 참고 : - 그것은 오류 _AX가 선언되지 않은 보여주는,하지만 난 변수를 선언 할 때, 그것은이 자주 온다 일부 쓰레기 값 *

+1

밑줄이나 대문자 또는 밑줄로 시작하는 식별자는 컴파일러/구현에 의해 예약 된 것으로 간주됩니다. '_AX'는 그 패턴과 매치되기 때문에 컴파일러에 특화된 기능이라는 것을 즉시 알 수 있습니다. –

+0

나는 그것이 C의 일부 dos 확장의 일부라고 생각한다. C 표준의 일부라고 생각하지 않는다. 어떤 컴파일러를 사용하고 있습니까? – CCoder

+0

Visual Studio 컴파일러 – Ravi

답변

10

보여줍니다? 그것은 완전히 말도 안돼. 아마도 _AX은 리턴 값에 대해 x86에서 사용되는 "ax"레지스터에 액세스하는 일부 컴파일러 관련 표기법입니다. 그러나 레지스터에있는 값이 할당과 함수 반환 사이에 clobbered 안된다 고 믿을 아무 이유도 없다. 이 프로그램은 정의되지 않은 동작을 호출합니다. 직업을 제공하는 누군가가 그러한 잘못된 관행을 알기를 기대한다면 RUN. 빠른. 그들은 유능하지 않습니다.

+0

'_AX'는 볼랜드 C 확장자이므로 볼랜드 컴파일러를 사용하지 않는 한 정의되지 않습니다. 자세한 내용은 http://stackoverflow.com/questions/10891566/ pseudo-registers-in-msvc – shf301

+3

붉은 깃발 더보기 : 그들은 암시 적 함수 선언과 암시적인'int'와 같은 오래된 나쁜 습관을 사용하고 있습니다. –

+0

이 종류의 확장은 레지스터에 직접 액세스하고 레지스터가 C 문 사이에서 값을 보유한다는 것을 컴파일러가 보장하므로 기본적으로 컴파일러가 ** 최적화를 수행하는 것을 배제합니다. 컴파일러는 C를 어셈블리 언어 용 최소 구조화 래퍼로 취급합니다. 즉, 코드가 생성된다는 것은 심하게 나빠질 것입니다. –