¿Cómo declarar la cadena C constexpr?

3 minutos de lectura

Avatar de usuario de Youda008
Yoda008

Creo que entiendo muy bien cómo usar la palabra clave constexpr para tipos de variables simples, pero estoy confundido cuando se trata de punteros a valores.

Me gustaría declarar un literal de cadena C constexpr, que se comportará como

#define my_str "hello"

Eso significa que el compilador inserta el literal de cadena C en cada lugar donde ingreso este símbolo, y podré obtener su longitud en tiempo de compilación con sizeof.

Lo es constexpr char * const my_str = "hello";

o const char * constexpr my_str = "hello";

o constexpr char my_str [] = "hello";

o algo todavía diferente?

  • Bueno, ¿realmente quieres una matriz o solo un puntero a un literal constante?

    – NathanOliver

    7 sep 2017 a las 15:38

  • Tener “longitud en tiempo de compilación con tamaño de”no es el valor lo que es importante sino el tipo.

    – Jarod42

    7 sep 2017 a las 15:39

  • @NathanOliver: Quiero algo que pueda poner en sizeof(my_str) y me dará la cantidad de bytes de esa cadena, no el tamaño del puntero.

    – Youda008

    7 sep 2017 a las 15:42

  • ¿Qué es “etc” en este caso?

    – KonstantinL

    7 sep 2017 a las 15:44

  • Después const char my_str[] = "hello"; es bastante bueno.

    – KonstantinL

    7 sep 2017 a las 15:47

avatar de usuario de eerorika
erorika

Lo es constexpr char * const my_str = "hello";

No, porque un literal de cadena no se puede convertir en un puntero a char. (Solía ​​​​ser anterior a C ++ 11, pero incluso entonces la conversión quedó obsoleta).

o const char * constexpr my_str = "hello";

No. constexpr no se puede ir allí.

Esto estaría bien formado:

constexpr const char * my_str = "hello";

pero no satisface esto:

Para poder obtener su longitud en tiempo de compilación con sizeof, etc.


o constexpr char my_str [] = "hello";

Esto está bien formado y, de hecho, puede obtener la longitud en tiempo de compilación con sizeof. Tenga en cuenta que este tamaño es el tamaño de la matriz, no la longitud de la cadena, es decir, el tamaño incluye el terminador nulo.

  • strlen(my_str) también funciona en tiempo de compilación; no estoy seguro si podrías contar con esto

    – anatolyg

    7 sep 2017 a las 15:54

  • @anatolyg No estoy seguro de dónde leíste eso std::strlen funciona un tiempo de compilación. ¿Qué implementación tiene esto, no cumple con los estándares?

    – Rakete1111

    7 sep 2017 a las 16:02

  • Aquí es una demostración; Creo que están usando gcc

    – anatolyg

    7 sep 2017 a las 16:06

  • @anatolyg Ahh, eso no es strlen se calcula en tiempo de compilación, pero VLA, una extensión no estándar que permite expresiones no constantes en los límites de la matriz. Aquí está un manifestación

    – Rakete1111

    7 sep 2017 a las 16:11


  • Esto es solo un poco sobre el tema aquí; Hice una pregunta separada sobre eso

    – anatolyg

    7 sep 2017 a las 16:42

Avatar de usuario de P0W
P0W

En C++17puedes usar std::string_view y string_view_literals

using namespace std::string_view_literals;
constexpr std::string_view my_str = "hello, world"sv;

Después,

my_str.size() es constante de tiempo de compilación.

  • Tenga en cuenta que, en general, string_view::data no garantiza una cadena terminada en nulo.

    – jakar

    19 de junio de 2018 a las 0:06

¿Ha sido útil esta solución?