代码之家  ›  专栏  ›  技术社区  ›  Antti Kissaniemi

为什么strlen()在VC++调试器中似乎返回了<void>?[关闭]

  •  0
  • Antti Kissaniemi  · 技术社区  · 5 年前

    我有一个C++类型的字符串 const char* 作为参数传递给strlen,但返回void。

    它像

    strlen(astruct.string);
    

    谢谢。。

    编辑:做了一些检查,

    strlen("test");
    

    仍然是空虚的。为什么?

    编辑:这是图片 http://img14.imageshack.us/img14/1808/strlen.png

    抱歉之前不清楚。格式化工作不太好。不管怎样,埃文·特兰和弗拉德·罗马斯库都解决了这个问题。还可以看看布莱恩·R·邦迪的答案。

    谢谢。请随意关闭。

    6 回复  |  直到 13 年前
        1
  •  3
  •   Tim Cooper    13 年前

    参考屏幕截图:调试器正在显示 <void> 对于 strlen(...) 实际上,它应该显示一个错误。

    不能调用方法并在调试器监视中显示其结果。调试器将只显示现有的变量和数据。它不能根据需要调用任意方法,因为这些方法可以改变正在调试的程序的状态,而这种方式既不是代码作者也不是调试器所预期的。

    您可以在代码中临时添加:

    size_t tmp_len = strlen(struc.string);
    

    然后编译,并将tmp-len添加到监视中。

        2
  •  6
  •   Evan Teran Benoît    15 年前

    您会被Visual Studio 6.0的蹩脚调试器所迷惑。不要依赖这个。由于内联或类似的原因,它可能无法获取返回值。

    打印出值以获得实际值。

    编辑:同样,从您的示例来看,似乎您无论如何都不会存储strlen的结果。这也可能是调试器没有看到返回值的原因。完全可能的是,如果您不使用该值,编译器决定不需要实际执行strlen。

    注:目前没有真正的理由 仍然 使用VC++6.0。它是一个古老的编译器和IDE,这是一个非常糟糕的C++编译器。Visual C++编译器的更新版本是免费的(没有IDE),使用它们。

        3
  •  4
  •   Brian R. Bondy    15 年前

    strlen不是void返回类型,而是您的调试器没有给出正确的消息。

    为什么你的脱衣舞女显得很空虚?

    您正在使用的strlen的实现可能围绕一个define strlen someothername_strlen进行包装。

    调试程序可能不支持对函数正确定义或某些其他修饰符。

    你需要做一些像ilen=strlen(“test”)这样的事情,然后在你的手表中检查ilen。

    通常情况下,您可以调用手表中的功能。例如,尝试定义以下函数,然后在手表中调用它:

    int testFunc(char*)
    {
      return 5;
    }
    

    结果你的手表里可能会有5个。

        4
  •  0
  •   Ecton    15 年前

    strlen返回一个整数,所以我假设您的意思是它返回“0”。

    另外,按照您指定数据类型的方式,我不能很清楚它是const char*还是const char**。如果是后者,那么您需要确保将**取消引用为单个*。

    我猜字符串以一个空字节开始,这就是它返回0的原因。

        5
  •  0
  •   Greg Hewgill    15 年前

    在C++中,函数总是返回声明的类型返回的值。自从 strlen 函数声明如下所示:

    size_t strlen(const char *);
    

    唯一能做的 可能地 返回是 size_t . 编译器在编译时使用这些信息来确定调用函数时如何处理返回值。这里的重点是如果 斯特伦 函数如上所述声明,它不能决定返回 void 有时和类型值 西泽特 其他时间。

    这通常是静态类型语言(如C++)的特性。在动态类型语言(perl、python、ruby、php等)中,函数可以决定每次调用任何类型的值。

        6
  •  -2
  •   Bernard    15 年前

    它不能返回虚空。void是缺少返回值,因此不能返回它。

    你怎么检查空虚呢?void不是一个值。请演示一下你是如何变得空虚的。它是编译时还是运行时?

    如果你真的有一个系统 strlen 声明时使用 void 返回类型,在另一个方向上尽可能快地运行。