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 중국어 웹사이트의 기타 관련 기사를 참조하세요!