>백엔드 개발 >C++ >C에서 컴파일 타임에 재귀 문자열 길이 함수의 평가가 보장됩니까?

C에서 컴파일 타임에 재귀 문자열 길이 함수의 평가가 보장됩니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-30 02:31:28827검색

Is the Evaluation of a Recursive String Length Function Guaranteed at Compile Time in C  ?

컴파일 시 C 문자열 길이 계산

C에서는 컴파일 중에 문자열 리터럴에 대한 계산을 수행할 수 있습니다. 다음 코드 조각을 고려하십시오.

<code class="c++">#include <cstdio>

int constexpr length(const char* str)
{
    return *str ? 1 + length(str + 1) : 0;
}

int main()
{
    printf("%d %d", length("abcd"), length("abcdefgh"));
}</code>

이 코드는 재귀 함수를 활용하여 컴파일 타임에 지정된 문자열 리터럴의 길이를 결정합니다. 결과를 인쇄하여 함수가 문자열 길이(예: 4와 8)를 올바르게 계산하는지 확인할 수 있습니다. 결과 어셈블리 코드는 이러한 계산이 컴파일 중에 수행된다는 것도 보여줍니다.

그러나 중요한 질문은 남아 있습니다. 이 길이 함수의 평가는 C 표준에 따라 컴파일 타임에 발생하도록 보장됩니까?

답은 생각만큼 간단하지 않습니다. C 표준 초안(섹션 5.19)에 따르면 상수 표현식은 "번역 중에 평가될 수 있습니다." 그러나 이는 단지 비표준적인 참고 사항일 뿐이며 확고한 보장은 아닙니다.

컴파일 시간 평가를 보장하기 위해 두 가지 전략을 활용할 수 있습니다.

  1. 상수 표현식 활용 : 배열 범위나 케이스 레이블과 같은 특정 표현식은 표준에 따라 상수여야 합니다. 이러한 컨텍스트에서 길이 함수를 사용하면 컴파일 시간 평가가 보장됩니다.
  2. constexpr 변수 초기화: 길이 함수의 결과를 constexpr 변수에 할당하면 컴파일러가 다음 위치에서 함수를 실행하도록 강제됩니다.

따라서 표준에서는 길이 함수가 컴파일 시간에 평가되도록 명시적으로 요구하지 않지만 이를 상수 표현식으로 활용하거나 constexpr 변수를 초기화하여 그러한 평가를 시행할 수 있습니다. 이 방법을 사용하면 컴파일 중에 해시 계산이나 복잡한 문자열 조작 수행 등 문자열 리터럴에 대한 정교한 계산을 수행할 수 있는 가능성이 열립니다.

위 내용은 C에서 컴파일 타임에 재귀 문자열 길이 함수의 평가가 보장됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.