이 코드를 가지고 : C 프로그램으로 컴파일 된 경우C 표준 라이브러리 확장 성은 C++ 프로그램에 어느 정도 영향을 줍니까?
int issuecode(int i)
{
return 2 * i;
}
int main(int argc, char **argv)
{
return issuecode(argc);
}
내가 그것을 이해하는 방법, 그것은 정의되지 않은 동작이있을 것이다. 이러한 표준 따옴표를 기반으로 I 이유 :
C99 , 7.26
(또는 C11, 7.31)다음 이름은 편의를 위해 개별 헤더 아래에 그룹화됩니다. 아래에 설명 된 모든 외부 이름은 프로그램에 포함 된 머리글에 관계없이 예약됩니다.
C99, 7.26.2 (또는 C11, 7.31.2) is
또는 to
와 소문자가 <ctype.h>
의 선언에 추가 할 수도 있고 시작
함수 이름 머리글.
C99, 7.1.3 (또는 C11, 7.1.3)
- 각 헤더 선언하거나
연관된 하위에있는 모든 식별자를 정의하고, 선택적으로 선언하거나 등재 된 식별자를 정의 관련된 미래의 도서관 지시문 하위 절과 식별자는 항상 사용을 위해 또는 파일 범위 식별자로 사용하기 위해 예약되어 있습니다.
[...] (미래 도서관 방향 포함) 다음 부절의에서 외부 링크와
- 모든 식별자는 항상 외부 링크 식별자로 사용하기 위해 예약되어 있습니다.
[...] 프로그램이 예약 된 컨텍스트 (7.1.4에서 허용하지 않음)에서 식별자를 선언하거나 정의하거나 예약 된 식별자를 매크로 이름으로 정의하면 동작이 정의되지 않았습니다.
은 상기 내용을 토대로, 나는 함수 이름 issuecode
실제로 <ctype.h>
에 사용하기 위해 예약되어 믿고, 그래서 프로그램은 기술적으로 UB가 있습니다.
질문 0 (온 전성 체크) : 내 표준 읽기가 정확하고 프로그램의 동작이 기술적으로 정의되지 않았습니까?
질문 1 : 프로그램에 C++ 코드로 컴파일 된 경우 UB가 있습니까?
나는 다음의 인용문에서 "C"의 "future library directions"가 C++ 표준 라이브러리의 일부가 아니라고 말하고 싶다. 그러나 나는 정말로 확신하지 못한다.
C++ 11, 21.7
표 74, 75, 76, 77, 78, 및 79은 각각, 헤더
<cctype>
,<cwctype>
,<cstring>
,<cwchar>
,<cstdlib>
(문자 변환)을 설명하고<cuchar>
. 이러한 헤더내용은 다음과 같이 수정하여, 각각 표준 C 라이브러리 헤더
<ctype.h>
,<wctype.h>
,<string.h>
,<wchar.h>
및<stdlib.h>
및 C 유니 TR 헤더와 같아야한다
"다음 수정 사항"에는 추가 예약 된 식별자가 없습니다. 표 74는 isdigit
및 isalnum
과 같은 함수 이름의 과세 목록입니다. C++ 11
, C.2
1.이 절은 표준 라이브러리는 표준 C 라이브러리에서 포함 ++은 C의 내용을 요약 한 것입니다. 또한 다른 하위 조항 (17.6.1.2, 18.2, 21.7)에 명시된 표준 C 라이브러리의 정의, 선언 또는 동작의 명시적인 변경 사항을 요약합니다. 다시
표 153에 나타낸 바와 같이
7. C++ 표준 라이브러리에서, C 라이브러리 (209 개)의 표준 기능을 제공하는 표 (153)는 taxative리스트이다.
질문 2 : 내가 질문 1에 대한 잘못된 생각과 프로그램이 실제로뿐만 아니라 C++로 UB이 있습니까 가정하면, 다음과 같이 변경이 영향을 줄 수?
namespace foo {
int issuecode(int i)
{
return 2 * i;
}
}
using namespace foo;
int main(int argc, char **argv)
{
return issuecode(argc);
}
참고 : 표준 따옴표는 각각의 언어에 대한 최신 공개적으로 사용할 수 초안입니다 초안 N1256 (C99), N1570 (C11)와 N3242 (C++ 11)에서 가져옵니다 버전.
0. 체크섬이 일치합니다. 1. 예, C++ 표준 라이브러리 **에는 모든 C 표준 라이브러리 (심지어 오래된, 더 이상 사용되지 않는 .h 헤더)가 포함되어 있습니다. 2. 네가 'std ::'네임 스페이스에 없기 때문에 나는 다시 예라고 생각한다. (가장 좋은 방법은 DS9K에서 테스트하는 것입니다.) –
+1,하지만 ... 심각하게? 이름이'is'로 시작하는 함수를 포함하는 C++ 프로그램은 UB가 있습니까? 그렇다면, 나는 항상 UB를 썼다. ... –
@AndyProwl 그건 내가 C 표준의 그 부분을 읽을 때 정확하게 생각했다. 그래서 나는 어쨌든이 질문을했습니다. 그리고 기술적으로는 비 정적 전역 함수입니다. 네임 스페이스를 사용하는 더 많은 이유 ;-) – Angew