2013-07-06 8 views
14

이 코드를 가지고 : 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)

  1. 각 헤더 선언하거나

    연관된 하위에있는 모든 식별자를 정의하고, 선택적으로 선언하거나 등재 된 식별자를 정의 관련된 미래의 도서관 지시문 하위 절과 식별자는 항상 사용을 위해 또는 파일 범위 식별자로 사용하기 위해 예약되어 있습니다.

    [...] (미래 도서관 방향 포함) 다음 부절의에서 외부 링크와

    • 모든 식별자는 항상 외부 링크 식별자로 사용하기 위해 예약되어 있습니다.
  2. [...] 프로그램이 예약 된 컨텍스트 (7.1.4에서 허용하지 않음)에서 식별자를 선언하거나 정의하거나 예약 된 식별자를 매크로 이름으로 정의하면 동작이 정의되지 않았습니다.

은 상기 내용을 토대로, 나는 함수 이름 issuecode 실제로 <ctype.h>에 사용하기 위해 예약되어 믿고, 그래서 프로그램은 기술적으로 UB가 있습니다.

질문 0 (온 전성 체크) : 내 표준 읽기가 정확하고 프로그램의 동작이 기술적으로 정의되지 않았습니까?

질문 1 : 프로그램에 C++ 코드로 컴파일 된 경우 UB가 있습니까?

나는 다음의 인용문에서 "C"의 "future library directions"가 C++ 표준 라이브러리의 일부가 아니라고 말하고 싶다. 그러나 나는 정말로 확신하지 못한다.

C++ 11, 21.7

  1. 표 74, 75, 76, 77, 78, 및 79은 각각, 헤더 <cctype>, <cwctype>, <cstring>, <cwchar>, <cstdlib> (문자 변환)을 설명하고 <cuchar>. 이러한 헤더

  2. 내용은 다음과 같이 수정하여, 각각 표준 C 라이브러리 헤더 <ctype.h>, <wctype.h>, <string.h>, <wchar.h><stdlib.h> 및 C 유니 TR 헤더와 같아야한다

"다음 수정 사항"에는 추가 예약 된 식별자가 없습니다. 표 74는 isdigitisalnum과 같은 함수 이름의 과세 목록입니다. 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

0. 체크섬이 일치합니다. 1. 예, C++ 표준 라이브러리 **에는 모든 C 표준 라이브러리 (심지어 오래된, 더 이상 사용되지 않는 .h 헤더)가 포함되어 있습니다. 2. 네가 'std ::'네임 스페이스에 없기 때문에 나는 다시 예라고 생각한다. (가장 좋은 방법은 DS9K에서 테스트하는 것입니다.) –

+1

+1,하지만 ... 심각하게? 이름이'is'로 시작하는 함수를 포함하는 C++ 프로그램은 UB가 있습니까? 그렇다면, 나는 항상 UB를 썼다. ... –

+0

@AndyProwl 그건 내가 C 표준의 그 부분을 읽을 때 정확하게 생각했다. 그래서 나는 어쨌든이 질문을했습니다. 그리고 기술적으로는 비 정적 전역 함수입니다. 네임 스페이스를 사용하는 더 많은 이유 ;-) – Angew

답변

1

편의상 다음 이름이 개별 머리글 아래에 그룹화되어 있습니다. 아래에 설명 된 모든 외부 이름은 프로그램에 포함 된 머리글에 관계없이 예약됩니다.

미리 정의 된 함수 목록이 예약되어 있습니다. 함수가 이름 충돌이 없으면 아무런 문제가 없습니다.

기능 중 하나 또는을로 시작하는 이름 및 소문자는 <ctype.h> 헤더에 선언에 추가 할 수있다.

수술 용어는 <ctype.h> 헤더에 추가 될 수있다. "~ 또는 ~"비트는 선언 구성에 대한 지침 일뿐입니다.

그래서 정말 C에 관해서는

++ 나는이 같은 생각은, 예를 들어 가지고 다음과 생각 ...이 정의되지 않은 동작이 없었다 결코 : 함수가 충돌하기 때문에 컴파일러 오류가 발생한다
namespace foo{ 
    int isupper (int c); 
} 

#include <cctype> 
using namespace foo; 
int main(void){ 
    isupper(92); 
} 

C 함수와 이름이 비슷하지만 네임 스페이스로 인해 std:: 또는 foo::을 호출 시작 부분에 추가하여 쉽게 고칠 수 있습니다.

+0

"예약 된 기능 목록이 있습니다"라고 생각하지 않습니다. 7.26 ("미래 라이브러리 방향")의 대부분은'is' 또는'to' 접두사와 같습니다. 예 : "E와 숫자로 시작하는 매크로", "Typedef는 int 또는 uint로 시작하고 _t로 끝납니다." 이것들이 규범 적이 지 않으면 절은 거의 무의미 할 것이고, 그것의 첫 단락과 거의 모순이 될 것이다. – Angew

+0

필자는 사양에 큰 UB 구멍을 남기지 않을 것이라고 생각합니다. 특히 개발자가 'toFoo' 기능을 가질 가능성이있는 그러한 명백한 동사 기능이 아니라면 어리석은 것입니다. – Mgetz

+0

나는 그것이 너무 큰 이름의 힙을 예비 할 것이라는 점에 동의한다. 어쩌면 의도 된 의미는 "구현시 이러한 이름을 추가하면 머리글이 포함되지 않은 경우에도 해당 이름이 예약됩니까?" 그런 식으로 읽지는 않겠지 만 아마도 더 이해할 수있을 것입니다. – Angew

0

C++ (11) 17.6.1.2 헤더

172

)가 C 표준 라이브러리 헤더 (부속서 D.5) 또한, 글로벌 네임 스페이스에 이름을 정의하는 동안 C++ C 도서관 시설에 대한 헤더 (17.6.1.2) 도 전역 이름 공간에서 이름을 정의합니다.

그러나 C++ 표준 라이브러리에서는 선언문 (C에서 매크로로 정의 된 이름 제외)의 선언은 네임 스페이스 std의 네임 스페이스 범위 (3.3.6) 내에 있습니다. 지정되지 않음 이러한 이름이 전역 네임 스페이스 범위 내에서 처음 선언되는지 여부는 명시 적 사용 - 선언 (7.3.3)에 의해 이 네임 스페이스 std로 주입되는지 여부.

따라서 <cctype>을 포함하지 않으면 동작이 잘 정의되어 있습니다. 당신이 그렇게한다면, 그것은 지정되지 않습니다.

+0

C99 7.26 응용 프로그램 C++의 경우 헤더 포함과 관련이 없습니다 (7.26 필요).적용되지 않으면 C++에서 UB를 사용할 수 없습니다. 왜냐하면 ''은 추가 이름을 보유하지 않기 때문입니다. 그래서 어떤면에서 내 질문의 핵심은 C99 7.26이 C++에 적용되는지 여부입니다. IOW, 귀하의 견적서에 나오는 "이 이름"은 무엇입니까? 나는이 인용구가 이것을 지적한다고 생각하지 않는다. – Angew