>백엔드 개발 >C++ >C에서 컴파일 타임 문자열을 선언하는 더 편리한 방법이 있습니까?

C에서 컴파일 타임 문자열을 선언하는 더 편리한 방법이 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-13 06:04:13540검색

Is There a More Convenient Way to Declare Compile-Time Strings in C  ?

C에서 편리하게 컴파일 타임 문자열 선언하기

컴파일 타임에 문자열을 생성하고 조작하는 것은 C에서 유용한 도구가 될 수 있습니다. 그러나 컴파일 타임 문자열을 선언하는 현재 프로세스는 번거롭고 가변 문자 시퀀스를 사용해야 합니다. C에서 컴파일 타임 문자열을 선언하는 더 편리한 방법이 있습니까?

기존 접근 방식과 한계

이상적으로는 다음을 선언하고 싶습니다. 다음과 같은 구문이 포함된 컴파일 타임 문자열:

using str1 = sequence<"Hello, world!">;

또는 다음을 사용할 수도 있습니다. 사용자 정의 리터럴:

constexpr auto str2 = "Hello, world!"_s;

그러나 선언된 str2 유형에는 constexpr 생성자가 없으며 사용자 정의 리터럴 접근 방식은 포인터-멤버 복잡성으로 인해 실현 가능하지 않습니다. 또한 이를 달성하기 위해 constexpr 함수를 사용하려고 하면 배열 또는 문자열 매개변수가 constexpr 유형이 아닌 문제가 발생합니다.

제안된 솔루션 및 현재 상태

현재 편리한 컴파일 타임 문자열 선언 문제를 구체적으로 다루는 제안이나 언어 기능은 없지만 Scott Schurr는 C Now 2012에서 str_const 유틸리티를 제안했습니다. 이 유틸리티는 constexpr 기능이 필요하지만 아래와 같이 매우 우아한 솔루션을 제공합니다.

int main() {
    constexpr str_const my_string = "Hello, world!";
    static_assert(my_string.size() == 13);
    static_assert(my_string[4] == 'o');
    constexpr str_const my_other_string = my_string;
    static_assert(my_string == my_other_string);
    constexpr str_const world(my_string.substr(7, 5));
    static_assert(world == "world");
//  constexpr char x = world[5]; // Does not compile because index is out of range!
}

C 17 업데이트

std::string_view 도입 C 17에서는 str_const에 대한 더 나은 대안을 사용할 수 있습니다. 위의 코드는 다음과 같이 다시 작성할 수 있습니다.

#include <string_view>

int main() {
    constexpr std::string_view my_string = "Hello, world!";
    static_assert(my_string.size() == 13);
    static_assert(my_string[4] == 'o');
    constexpr std::string_view my_other_string = my_string;
    static_assert(my_string == my_other_string);
    constexpr std::string_view world(my_string.substr(7, 5));
    static_assert(world == "world");
//  constexpr char x = world.at(5); // Does not compile because index is out of range!
}

이 접근 방식은 컴파일 시간 문자열 조작 기능과 범위를 벗어난 검사를 모두 제공합니다.

위 내용은 C에서 컴파일 타임 문자열을 선언하는 더 편리한 방법이 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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