programing

C 표준 라이브러리의 심볼은 C++에 예약되어 있습니까?

newstyles 2023. 9. 16. 08:44

C 표준 라이브러리의 심볼은 C++에 예약되어 있습니까?

이것은 다른 질문에 대한 후속 조치입니다.

원래 질문은 다른 문제가 있었지만, (CLang에 따르면) 주요 문제는 C++를 포함한 멋진 C++만 사용되는 다른 기호로 재정의되었다는 것을 깨달아야 했습니다.

다음은 축소된 버전입니다.

#include<iostream>

using std::cout;
using std::endl;

class time
{
public:
    int h, min, sec;
};

const int full = 60;

void canonify(time& pre)     // Error here (line 14)
{
    pre.min += pre.sec / full;
    pre.h += pre.min / full;
    pre.sec %= full;
    pre.min %= full;
}
int main()
{
    time a;                  // and here (line 23)
    a.h = 3;
    a.min = 128;
    a.sec = 70;
    canonify(a);
    cout << a.h << ":" << a.min << ":" << a.sec << endl;
}

물론, 교체하는 것은time다른 기호로 또는 사용.struct time문제를 없애기에 충분합니다.다르게 말씀드리면 제 질문은 코드를 어떻게 실행하느냐가 아니라 C 라이브러리의 심볼을 C++의 예약된 토큰으로 봐야 하느냐 하는 것입니다.Clang 11(MSVC19에서)은 다음과 같이 초크합니다.

1>ess.cpp(14,15): error : must use 'class' tag to refer to type 'time' in this scope
1>...\ucrt\time.h(518,42): message : class 'time' is hidden by a non-type declaration of 'time' here
1>ess.cpp(23,5): error : must use 'class' tag to refer to type 'time' in this scope
1>...\ucrt\time.h(518,42): message : class 'time' is hidden by a non-type declaration of 'time' here

그래서 문제는 C++ 표준은 컴파일 단위에 명시적으로 포함되지 않은 C 표준 라이브러리의 심볼을 자유롭게 사용하는 것을 금지하는 곳입니다.


흥미롭게도 C에서는 동일한 코드(한 번 번역되면...)가 잘 작동합니다.

#include <stdio.h>

//
typedef struct 
{
    int h, min, sec;
}time;
//
const int full = 60;
//
void canonify(time* pre)
{
    pre->min += pre->sec / full;
    pre->h += pre->min / full;
    pre->sec %= full;
    pre->min %= full;
}
int main()
{
    time a;
    a.h = 3;
    a.min = 128;
    a.sec = 70;
    canonify(&a);
    printf("%d:%d:%d\n", a.h, a.min, a.sec);
    return 0;
}

[외부 이름]

3 외부 링크와 함께 선언된 C 표준 라이브러리의 각 이름은 네임스페이스 std와 글로벌 네임스페이스에서 모두 외부 "C" 링크와 함께 사용할 수 있도록 구현에 예약됩니다.

이 단락은 이름 자체를 보유하고 있습니다.소엘리어싱time글로벌 네임스페이스에서 이 계약을 위반합니다.

C++ 표준이 C 표준 라이브러리의 기호를 자유롭게 사용하는 것을 금지하는 곳

최신 초안:

[외부 이름]

외부 링크와 함께 선언된 C 표준 라이브러리의 각 이름은 네임스페이스 std와 글로벌 네임스페이스에서 모두 외부 "C" 링크와 함께 사용할 수 있도록 구현에 예약됩니다.

외부 링크와 함께 선언된 C 표준 라이브러리의 각 함수 서명은 외부 "C"와 외부 "C++" 링크가 모두 연결된 함수 서명 또는 글로벌 네임스페이스의 네임스페이스 범위 이름으로 사용하기 위해 구현에 예약됩니다.


그것들이 컴파일 단위에 명시적으로 포함되지 않을 때?

표준 라이브러리를 사용하는 경우 표준 라이브러리의 모든 이름 예약이 적용됩니다.

표준 헤더(또는 정확한 내용이 제어되지 않으므로 표준 헤더를 포함할 수 있는 헤더)를 포함하는 경우 C에서 상속된 헤더를 포함한 다른 표준 헤더를 간접적으로 포함할 수 있습니다.

언급URL : https://stackoverflow.com/questions/68455008/are-symbols-from-the-c-standard-library-reserved-in-c