program story

C ++에서 C 헤더를 사용할 때 std :: 또는 전역 네임 스페이스의 함수를 사용해야합니까?

inputbox 2020. 8. 13. 08:19
반응형

C ++에서 C 헤더를 사용할 때 std :: 또는 전역 네임 스페이스의 함수를 사용해야합니까?


C는 정확히는 아니지만 C ++의 하위 집합입니다. 따라서 우리는 이름을 약간 변경하여 ( stdio.hto cstdio, stdlib.hto cstdlib) C ++에서 대부분의 C 함수 / 헤더를 사용할 수 있습니다 .

제 질문은 실제로 일종의 의미 론적입니다. C ++ 코드에서, 내가 호출 할 수 있습니다 (GCC 컴파일러의 최신 버전을 사용) printf("Hello world!");std::printf("Hello world!");와 정확히 동일하게 작동합니다. 그리고 참조에서 나는 그것을 사용하고 있습니다 std::printf("Hello world!");.

내 질문은 std::printf();C ++에서 사용하는 것이 선호 됩니까? 차이가 있습니까?


C ++ 11 표준에서 (강조 내) :

D.5 C 표준 라이브러리 헤더 [depr.c.headers]

  1. C 표준 라이브러리와의 호환성을 위해 ...
  2. 각각 name.h 형식의 이름을 가진 모든 C 헤더 는 해당 cname 헤더에 의해 표준 라이브러리 네임 스페이스에 배치 된 각 이름 전역 네임 스페이스 범위 내에 배치 된 것처럼 작동 합니다. 이 이름은 제 선언 또는 공간 범위 내에서 정의되어 있는지 불특정 (3.3.6) 네임 스페이스 STD 하고 명시하여 선언 - (7.3.3)가 글로벌 네임 스페이스의 영역에 주입된다.
  3. 예 : 헤더 는 네임 스페이스 내에서 선언 및 정의를 <cstdlib> 확실히 제공 합니다std . 또한 전역 네임 스페이스 내에서 이러한 이름을 제공 할 수 있습니다. 헤더 는 C 표준에서와 마찬가지로 전역 네임 스페이스 내 에서 동일한 선언과 정의를 <stdlib.h> 확실히 제공합니다 . 네임 스페이스 내에서 이러한 이름을 제공 할 수도 있습니다 .std

«name.h»헤더 사용은 더 이상 사용되지 않으며 향후 개정에서 제거 할 후보로 식별되었습니다.

따라서«cname»헤더를 포함하고 std네임 스페이스 의 선언과 정의를 사용하는 것이 좋습니다 .

어떤 이유로«name.h»헤더를 사용해야하는 경우 (사용되지 않음, 위 참조) 전역 네임 스페이스의 선언과 정의를 사용하는 것이 좋습니다.

즉, 선호

#include <cstdio>

int main() {
    std::printf("Hello world\n");
}

위에

#include <stdio.h>

int main() {
    printf("Hello world\n");
}

<cmeow>항상 제공 ::std::purr하거나 제공하지 않을 수도 있습니다 ::purr.

<meow.h>항상 제공 ::purr하거나 제공하지 않을 수도 있습니다 ::std::purr.

포함하는 헤더에서 제공하는 것이 보장되는 양식을 사용하십시오.


아니, 당신은 어느 쪽이든 괜찮습니다.

원래 목적은이었다 <___.h>헤더 글로벌 네임 스페이스에 모든 것을 넣어 C 버전이 될 것하고 <c___>는 ified 버전의의 장소 다 - 헤더가 C ++ 것 std네임 스페이스.

실제로, 그래도 C ++ 버전은 또한 글로벌 네임 스페이스에 모든 것을 넣어. 그리고 std::버전 을 사용하는 것이 "올바른 일" 이라는 명확한 합의가 없습니다 .

따라서 기본적으로 원하는 것을 사용하십시오. 가장 일반적인 방법은 전역 네임 스페이스 ( printf대신 std::printf) 에서 C 표준 라이브러리 함수를 사용하는 것입니다 . 그러나 하나를 "더 나은"것으로 간주 할 이유가별로 없습니다.


유일한 차이점은 범위 확인을 std::printf()추가 std::하면 나중에 같은 이름의 함수를 작성하는 사람으로부터 자신을 보호 할 수 있다는 것입니다. 이로 인해 네임 스페이스 충돌이 발생합니다. 두 가지 사용 모두 정확히 동일한 OS API 호출로 이어집니다 (리눅스에서를 실행하여 확인할 수 있습니다 strace your_program).

printf()가장 일반적으로 사용되는 함수 중 하나 인 것처럼 누군가가 이와 같은 함수의 이름을 지정할 가능성은 매우 낮 습니다. 또한 C ++에서 iostreams는 cstdioprintf와 같은 함수에 대한 호출보다 우선합니다.


C ++ 11 표준에서 :

각각 name.h 형식의 이름을 가진 모든 C 헤더는 해당 cname 헤더에 의해 표준 라이브러리 네임 스페이스에 배치 된 각 이름이 전역 네임 스페이스 범위 내에 배치되는 것처럼 작동합니다. 이러한 이름이 std 네임 스페이스의 네임 스페이스 범위 (3.3.6) 내에서 처음 선언되거나 정의 된 다음 명시 적 using-declarations (7.3.3)에 의해 전역 네임 스페이스 범위에 삽입되는지 여부는 지정되지 않습니다.

따라서을 사용 <cstdio>하면, 즉 글로벌 네임 스페이스가 아니라에 printf있을 것임을 확신 할 수 있습니다 namespace std.
전역 네임 스페이스를 사용하면 이름 충돌이 발생합니다. 이것은 C ++ 방식이 아닙니다.

따라서 <cstdio>헤더를 사용 하고 있으며 그렇게하도록 조언합니다.


내 연습에서 : std::접두사를 사용하십시오 . 그렇지 않으면 부동 소수점을 사용하는 경우 언젠가 abs 매우 고통스럽게 물릴 것입니다.

정규화되지 않음 은 일부 플랫폼에 abs정의 된 기능을 나타냅니다 int. 다른 사람들에게는 과부하가 걸립니다. 그러나 std::abs항상 모든 유형에 대해 오버로드됩니다.


printf없이 사용하면 std::일부 이름 충돌이 발생할 수 있으며 많은 C ++ 개발자가 나쁜 습관으로 간주합니다. Google은이 문제에 대해 친구이지만 여기에 몇 가지 링크가 있습니다. 도움이되기를 바랍니다.

"namespace std 사용"이 나쁜 습관으로 간주되는 이유는 무엇입니까? http://www.cplusplus.com/forum/beginner/61121/


stdio에서

이것은 표준 C 라이브러리 헤더 @c stdio.h의 C ++ 버전이며 그 내용은 (대부분) 해당 헤더와 동일하지만 모두 네임 스페이스 @c std에 포함됩니다 (매크로로 정의 된 이름 제외). 씨).

따라서 아무런 차이가 없어야합니다.

참고 URL : https://stackoverflow.com/questions/32606023/when-using-c-headers-in-c-should-we-use-functions-from-std-or-the-global-na

반응형