Почему strlen(), похоже, возвращает <void> в отладчике VC ++?[закрыто]

StackOverflow https://stackoverflow.com/questions/576396

  •  05-09-2019
  •  | 
  •  

Вопрос

У меня есть строка в C ++ типа const char* передается в качестве аргумента strlen, но возвращает значение void.

это звучит так

strlen(astruct.string);

Спасибо..

Редактировать:Провел кое-какую проверку,

strlen("test");

все еще дает пустоту..почему?

Редактировать:Вот изображение http://img14.imageshack.us/img14/1808/strlen.png

Извините за то, что был неясен ранее.Форматирование работало не совсем хорошо.Как бы то ни было, путаницу разрешили и Эван Теран, и Влад Ромашкану.Также взгляните на Брайана Р.Ответ Бонди.

Спасибо.Не стесняйтесь закрывать.

Это было полезно?

Решение

Ссылка на ваш снимок экрана:ваш отладчик отображает <void> для strlen(...) когда на самом деле он должен отображать ошибку.

Вы не можете вызывать методы и отображать их результаты в отладчике watch.Отладчик будет отображать только существующие переменные и данные.Он не может вызывать произвольные методы по требованию, поскольку методы могут изменять состояние отлаживаемой программы способами, которые не были предусмотрены ни автором кода, ни отладчиком.

Что вы можете сделать, так это временно добавить в свой код:

size_t tmp_len = strlen(struc.string);

затем скомпилируйте и добавьте tmp_len в watch .

Другие советы

Вас смущает дерьмовый отладчик visual Studio 6.0.Не полагайтесь на это.Вероятно, он не смог получить возвращаемое значение из-за встраивания или чего-то подобного.

Выведите значение, чтобы получить реальное значение.

Редактировать:Кроме того, из вашего примера видно, что вы, возможно, в любом случае не сохраняете результат strlen .Это также может быть причиной, по которой отладчик не видит возвращаемое значение.Вполне возможно, что компилятор решил, что ему не нужно фактически выполнять strlen, если вы не используете значение.

ПРИМЕЧАНИЕ:на данный момент нет никакого реального оправдания для все еще используя VC ++ 6.0.Это древний компилятор и IDE, который является возмутительно плохим компилятором c ++.Более новые версии компилятора visual c ++ бесплатны (без IDE), используйте их.

strlen не имеет возвращаемого типа void, это ваш отладчик выдает неправильное сообщение.

Почему ваш debbuger показывает void?

Реализация strlen, которую вы используете, вероятно, обернута вокруг #define strlen someothername_strlen.

Отладчик, вероятно, не поддерживает #define должным образом или некоторые другие модификаторы функции.

Вам нужно будет сделать что-то вроде iLen = strlen("test"), затем проверить iLen в ваших часах.

Обычно вы можете вызывать функции в своих часах.Например, попробуйте определить следующую функцию, а затем вызвать ее в ваших часах:

int testFunc(char*)
{
  return 5;
}

В результате вы, вероятно, получите 5 баллов на своих часах.

strlen возвращает целое число, поэтому я предполагаю, что вы имеете в виду, что оно возвращает "0".

Кроме того, по тому, как вы указываете свой тип данных, я не могу точно сказать, является ли это const char * или const char ** .Если это последнее, то вам нужно убедиться, что вы разыменовываете ** на одиночный *.

Я предполагаю, что строка начинается с нулевого байта, именно поэтому она возвращает 0.

В C ++ функции всегда возвращают значение того типа, для возврата которого они объявлены.С тех пор как strlen объявление функции выглядит примерно так:

size_t strlen(const char *);

единственное, что он может возможно возврат - это size_t.Компилятор использует эту информацию во время компиляции, чтобы определить, как обрабатывать возвращаемое значение при вызове функции.Дело здесь в том, что если strlen функция объявлена как указано выше, она не может решить вернуть void иногда и значение типа size_t в другие времена.

Обычно это характерно для статически типизированных языков, таких как C ++.В языках с динамической типизацией (Perl, Python, Ruby, PHP и т.д.) функция может решить возвращать значение любого типа при каждом ее вызове.

Он не может вернуть void.Void - это отсутствие возвращаемого значения, поэтому вы не можете, допустив ошибку, вернуть его.

В любом случае, как вы проверяете наличие void?Пустота - это не ценность.Пожалуйста, продемонстрируйте, как вы получаете void.Это время компиляции или время выполнения?

Если у вас действительно есть система, в которой strlen объявляется с помощью void возвращаемый тип: бегите как можно быстрее в другом направлении.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top