Как определять размер char в C ++?

У меня есть следующий код и меня вызывает ошибка в VS2015

int funcion(const char* url) {
    char req[strlen(url) + 31];
}

У вызова функции должна быть постоянная стоимость в постоянном выражении.

strlen или sizeof в этом случае?

1
задан 18.01.2017, 12:15
0 ответов

Чтобы инициализировать используй new

int funcion(const char* url) {
    char *req = new char [strlen(url) + 31];
}

Если ты это хочешь инициализировать со стоимостью 0:

char *req = new char [strlen(url) + 31]();
2
ответ дан 03.12.2019, 17:41
  • 1
    Спасибо!, функционируй. –  14.01.2017, 02:01
  • 2
    Довольный тем, что помогает тебе. –  14.01.2017, 02:02
  • 3
    Этот ответ дает có я говорю альтернативный для того, чтобы программа функционировала, но он не объясняет из-за qué solució n инициал - erró nea. Тот, кто спрашивает podrí чтобы изучать, которому все должно делать это с new, чтобы уходить проблем, и má s, которому помогать в конце концов malenseñ схвати –  17.01.2017, 06:43

Ты используешь, не зная этого, функция, названная Я Упорядочиваю Изменчивого Размера (Переменная Ленгт Арраи как знают на Английском языке), перевожу Wikipedia:

В программировании, Договоренности Изменчивого Размера (ATV), это договоренность автоматического хранения, длина которого решается во время выполнения (вместо во времени компиляции).

Между языками, которые выносят ATV, у нас есть Ада, Algol 68, APL, C99, C# (в не-безопасном способе), КОБОЛ, Фортран 90 и J.

Использование Договоренностей Изменчивого Размера в C ++ и в C

C ++ он не дает опору Договоренностям Изменчивого Размера родным образом, но какие-то составители осуществляют их как расширение compilador1; между составителями, которые осуществляют это расширение, не находится MSVC.

Относительно C: стандарт C99 выносит Договоренности Изменчивого Размера, но начиная со стандарта C112 вышеупомянутая опора переходит к тому, чтобы быть опциональной.

Следовательно, составляя C ++ в MSVC твой код:

int funcion(const char* url) {
    char req[strlen(url) + 31];
}

Он незаконный, так как ты используешь Договоренность Изменчивого Размера, у какового нет опоры в MSVC.

Какова проблема?

В C ++ он обязательный, что у договоренностей, созданных в батарейке (автоматическое хранение) был исчислимый размер во времени компиляции, выражение, которое ты использовал в размере req только он исчислимый во время выполнения, и отсюда следует, что я отпустил тебе ошибку:

La llamada de la funcion debe tener un valor constante en una expresion constante.

Стоимость указателя url только он известен во время выполнения и как следствие инструкция strlen(url) он не является исчислимым во времени компиляции и из-за этого выражение strlen(url) + 31 также он это не.

Возможные решения.

Используя функцию constexpr

Создай функцию, которая вычисляла бы размер цепи (указанная указателем) во времени компиляции. Для этого ты будешь должен использовать цензор constexpr:

constexpr int longitud(const char* cadena) {
    int result{0};

    while (*cadena) {
        ++cadena;
        ++result;
    }

    return result;
}

Мы сможем использовать функцию longitud чтобы вычислять во времени компиляции длину цепей:

std::int8_t arreglo[ longitud("Hola mundo!") + 31 ] {};
std::cout << sizeof arreglo; // muestra 42 (11 + 31)

Но характеризовать функцию с constexpr это не гарантия, который составитель будет оценивать вышеупомянутую функцию во времени компиляции, если функция получает параметры, не известные во время компиляции, он будет оценен во время выполнения и следовательно он не состоял бы usable в контекстах в том, чтобы они потребовали постоянных выражений:

int main(int argc, char **argv)
{
    // error de compilacion *argv no es conocido en tiempo compilacion
    std::int8_t arreglo[ longitud(*argv) + 31 ] {};
    return 0;
}

Используя std::vector

Также ты можешь оставлять мысль использовать договоренность и переходить к тому, чтобы использовать один std::vector:

int funcion(const char* url) {
    std::vector<char> req(strlen(url) + 31);
}

В зависимости от использования, которое ты даешь ему в req позже, ты будешь должен делать какие-то изменения в твой код для того, чтобы решение с std::vector функционируйте.


1Entre самые популярные и использованные мы имеем gcc и llvm,

2C99 он старее, что C11, число не соответствует версии, если не с годом одобрения. Итак C99 он 1999 в то время как C11 он 2011.

3
ответ дан 03.12.2019, 17:41