isDefined函数?

时间:2009-09-24 11:15:51

标签: c++

在C ++中,有任何函数在定义变量时返回“true”,反之亦然。像这样:

bool isDefined(string varName)
{
    if (a variable called "varName" is defined)
      return true;
    else
      return false;
}

8 个答案:

答案 0 :(得分:11)

C++不是动态语言。这意味着答案是 no 。你在编译时知道这一点,而不是运行时。

答案 1 :(得分:6)

在运行时没有这样的东西,因为它在非动态语言中没有意义,如C ++。

但是你可以在sizeof中使用它来测试它是否在编译时存在而没有副作用。

(void)sizeof(variable);

如果var不存在,那将停止编译。

答案 2 :(得分:1)

如前所述,C ++运行时系统不支持查询是否声明变量。通常,C ++二进制文件不包含有关变量符号或其位置映射的信息。从技术上讲,这些信息将以一个使用调试信息编译的二进制文件中提供,您当然可以查询调试信息以查看代码中给定位置是否存在变量名称,但它最好是一个肮脏的黑客(如果你我很好奇地看到它可能会看到什么,我发布了一个可怕的片段@ Call a function named in a string variable in C,它使用DWARF调试信息通过字符串调用C函数。不建议这样做。

答案 3 :(得分:1)

Microsoft对C ++有两个扩展名:__if_exists__if_not_exists。它们在某些情况下很有用,但它们不接受字符串参数。

如果您真的需要这样的功能,可以将所有变量添加到一个集合中,然后查询该变量存在的集合。

答案 4 :(得分:0)

没有。这并不像你有一个围绕C ++的运行时系统,它会记住某些表(元数据)中带有名称的变量,并允许你通过动态生成的字符串访问变量。如果你想要这个,你必须自己构建它,例如使用std :: map将字符串映射到某些对象。

一些编译时机制适合该语言。但我不认为这会有用。

答案 5 :(得分:0)

已经提到C ++没有提供这样的功能。

另一方面,有些情况下操作系统实现机制关闭isDefined()
与Windows上的GetProcAddress Function一样。

答案 6 :(得分:0)

为了实现这一目标,您需要实现动态变量处理系统,或者至少在互联网上找到一些。如前所述,C ++被设计为本地语言,因此没有内置工具可以做到这一点。 我可以为最简单的解决方案建议使用字符串键创建一个std :: map,使用boost :: any,wxVariant或类似的东西存储感兴趣的全局变量,并将变量存储在此映射中。您可以使用一些预处理程序指令通过其名称定义变量,从而使您的生活更轻松,因此您无需重新键入变量的名称两次。另外,为了让生活更轻松,我建议创建一个访问此变量映射的小内联函数,并检查映射是否包含给定的字符串键。 在许多地方都有实现这样的功能,运行时属性处理系统可以以不同的方式使用,但是如果你只需要这个功能我建议你自己实现,因为大多数这些解决方案都很普遍,你可能不需要

答案 7 :(得分:0)

你可以做这样的功能,但它不会操作字符串。你必须发送变量名称。这样的函数会尝试将0添加到变量中。如果它不存在,则会发生错误,因此您可能希望尝试使用try...throw...catch进行异常处理。但是因为我在打电话,我不知道在尝试将不存在的变量发送到函数时是否会抛出错误...