C ++에서 C 헤더를 사용할 때 std :: 또는 전역 네임 스페이스의 함수를 사용해야합니까?
C는 정확히는 아니지만 C ++의 하위 집합입니다. 따라서 우리는 이름을 약간 변경하여 ( stdio.h
to cstdio
, stdlib.h
to 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]
- C 표준 라이브러리와의 호환성을 위해 ...
- 각각 name.h 형식의 이름을 가진 모든 C 헤더 는 해당 cname 헤더에 의해 표준 라이브러리 네임 스페이스에 배치 된 각 이름 이 전역 네임 스페이스 범위 내에 배치 된 것처럼 작동 합니다. 인 이 이름은 제 선언 또는 공간 범위 내에서 정의되어 있는지 불특정 (3.3.6) 의 네임 스페이스 STD 하고 명시하여 선언 - (7.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 ++에서 iostream
s는 cstdio
printf와 같은 함수에 대한 호출보다 우선합니다.
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에 포함됩니다 (매크로로 정의 된 이름 제외). 씨).
따라서 아무런 차이가 없어야합니다.
'program story' 카테고리의 다른 글
UITableViewCell의 iOS7에서 자동 레이아웃 제약 문제 (0) | 2020.08.13 |
---|---|
laravel .env 파일에 주석을 추가하는 방법은 무엇입니까? (0) | 2020.08.13 |
Intellij IDEA에 대해 자동 형식 코드를 활성화하려면 어떻게해야합니까? (0) | 2020.08.13 |
https를 사용하여 SSL 암호화 사이트에 액세스하려면 WebRequest를 어떻게 사용합니까? (0) | 2020.08.13 |
NumPy에서 NaN에 대한 빠른 확인 (0) | 2020.08.13 |