GetCWD ()가 ISO C ++가 준수하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/647704

  •  22-07-2019
  •  | 
  •  

문제

이 MSDN 기사 getcwd ()가 더 이상 사용되지 않았으며 ISO C ++ 호환 _getCWD를 대신 사용해야하는 상태로서 질문을 제기해야합니다. getCWD ()가 ISO를 준수하지 않게하는 이유는 무엇입니까?

도움이 되었습니까?

해결책

표준에 지정되지 않은 함수는 공급 업체 별 확장자를 표시하거나 비 ISO 표준에 부착 된 밑줄로 밑줄에 의해 접두사에 의해 접두어를 접두사해야합니다. 따라서 여기서 "준수"는 Microsoft가 ISO 표준의 일부가 아니기 때문에이 특정 기능의 이름에 밑줄을 추가하는 것이 었습니다.

다른 팁

이있다 좋은 토론 그것에 대해. PJ Plauger 이것에 대한 답

나는 1983 년에 C 프로그램에서 이용할 수있는 이름의 공간이 다음과 같이 분할 될 것이라고 주장한 사람이다.

ㅏ) 프로그래머의 이익을 위해 구현에 의해 정의 된 것 (예 : printf)
비) 프로그래머에게 예약 된 사람들 (예 : foo)
씨) 구현에 예약 된 사람들 (예 : _unlink)

우리는 심지어 "구현"이 너무 모 놀리 식 (종종 구현의 소스 소스 소스 비트 이상)이라는 것을 알았지 만 당시 우리가 할 수있는 최선이었습니다. Standard C ++는 도움이 될 네임 스페이스를 도입했지만 명시된 목표의 일부만 달성했습니다. (그것은 당신이 종이 호랑이를 표준화 할 때 일어나는 일입니다.)

이 특별한 경우, Posix는 특정 헤더를 포함 할 때만 정의 해야하는 범주 목록 (a) 이름 (예 : indink) 목록을 제공합니다. C 표준은 POSIX와 동일한 소스 인 UNIX에서 헤더를 훔쳤으므로 일부 헤더는 역사적으로 겹칩니다. 그럼에도 불구하고, 컴파일러 경고는 지원되는 환경이 "순수한"표준 C ++ (플라톤 이상) 또는 혼합 C/C ++/Posix 환경인지 여부를 고려해야합니다. 가난한 프로그래머가 우리를 도와 주려는 Microsoft의 현재 시도는이를 고려하지 않습니다. 그것은 링크를 카테고리 (b) 이름으로 취급하는 것을 주장합니다.이 이름은 근시입니다.

글쎄, GCC는 Strict C 모드에서 POSIX 이름을 선언하지 않습니다 (적어도 C ++ 모드에서는 여전히).

#include <stdio.h>

int main() {
    &fdopen;
    return 0;
}

출력 사용 -std=c99

test.c: In function 'main':
test.c:4: error: 'fdopen' undeclared (first use in this function)

기능 테스트 매크로를 사용하거나 특정 표준을 전달하지 않음으로써 혼합 된 C/POSIX에서 작동하고 있음을 명시 적으로 알려야합니다. 그러면 기본값이됩니다 gnu89 혼합 환경을 가정합니다 (man feature_test_macros). 분명히 MSVC에는 그러한 가능성이 없습니다.

다른 사람들이 이미 지적했듯이 GetCWD는 ISO C ++에 포함되어 있지 않지만 일부입니다. posix/IEEE STD 1003.1.

Microsoft는 C 표준 라이브러리에 가장 일반적으로 사용되는 POSIX 기능을 포함시키기로 결정했습니다 (그러나 이러한 기능을 본질적으로 사용하지 않도록 밑줄로 접두사를 접두어로 접두어를 접두사합니다).

Dan Olson의 게시물에 추가하려면 : ANSI C 준수 MSDN의 페이지

Microsoft 별 함수 및 글로벌 변수의 이름은 단일 밑줄로 시작합니다. 이 이름은 코드의 범위 내에서 로컬로만 재정의 할 수 있습니다. 예를 들어, Microsoft 런타임 헤더 파일을 포함시킬 때 동일한 이름의 로컬 변수를 선언하여 _open이라는 Microsoft 별 함수를 로컬로 재정의 할 수 있습니다. 그러나이 이름은 자신의 글로벌 기능 또는 글로벌 변수에 사용할 수 없습니다.

내가 알고있는 한 getCWD ()는 ISO 표준 C ++의 일부가 된 적이 없습니다. _getCWD ()는 표준 이름이 밑줄로 시작하지 않기 때문에 확실히 아닙니다.

실제로 MSDN 기사는 선언 된 사람 페이지로 연결됩니다. Direct.h, 표준 C ++ 헤더 파일이 아닙니다. 이 기사는 나에게 가짜처럼 보인다.

기록을 위해 getcwd() ISO에 의해 더 이상 사용되지 않았습니다. 그것은 Microsoft에 의해 "더 이상 사용되지 않았다". Microsoft는 많은 C 함수를 다시 작성했습니다. 종종 보안을 조금 더 잘 염두에두고 max_length 매개 변수). 그런 다음 컴파일러 가이 경고를 뱉어 냈습니다. 표준 그룹이 이상한 기능을 사용하지 않았기 때문에 가짜라고 생각합니다.

MSDN 기사는 평범한 사람이 빠른 독서에서 결론을 내릴 수있는 것에 대해 다소 혼란 스럽습니다 (매우 신중한 변호사의 눈으로 읽지 않는다면).

MSDN 기사가 말하는 것은 다음과 같습니다. GetCWD ()는 ISO C ++ 표준을 준수하지 않습니다. 함수 이름 (GetCWD가 위반하는 것)을위한 ISO C ++ 표준을 준수하기 위해 Microsoft는 함수의 전면에 _를 올바르게 넣으므로 동일한 함수가 _GetCWD ()가됩니다. getCWD () 및 _GetCWD ()가 ISO C ++ 표준 기능이 아니지만 Microsoft (공급 업체) 특정 또는 구현 특정 기능이기 때문에 기능을 명명하는 ISO C ++ 호환 방법입니다.

이 기사는 작업 디렉토리를 얻기위한 C ++ ISO 표준 호출이 무엇인지 나타내지 않습니다. 그러나 사람들이 한 눈에 읽는 경향이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top