Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定义函数? 在C++中,当变量被定义或false为false时,有任何函数返回“true”。大概是这样的: bool isDefined(string varName) { if (a variable called "varName" is defined) return true; else return false; }_C++ - Fatal编程技术网

定义函数? 在C++中,当变量被定义或false为false时,有任何函数返回“true”。大概是这样的: bool isDefined(string varName) { if (a variable called "varName" is defined) return true; else return false; }

定义函数? 在C++中,当变量被定义或false为false时,有任何函数返回“true”。大概是这样的: bool isDefined(string varName) { if (a variable called "varName" is defined) return true; else return false; },c++,C++,C++不是一种动态语言。这意味着,答案是否定的。你知道编译时,不是运行时。< P>在运行时没有这样的事情,因为它在C++中没有任何意义。 但是,您可以在sizeof中使用它来测试它是否存在于编译时,并且没有副作用 (void)sizeof(variable); 如果VAR不存在,这将停止编译。 < P>不。这不是像你在C++中有一个运行时系统,它总是记住在某些表(元数据)中有名字的变量,并允许通过动态生成的字符串访问变量。如果需要,您必须自己构建它,例如使用std::map将字符串映射到某些对

C++
不是一种动态语言。这意味着,答案是否定的。你知道编译时,不是运行时。

< P>在运行时没有这样的事情,因为它在C++中没有任何意义。 但是,您可以在sizeof中使用它来测试它是否存在于编译时,并且没有副作用

(void)sizeof(variable);

如果VAR不存在,这将停止编译。

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


一些编译时机制将适合该语言。但是我认为它不会有任何用处。

< P>已经提到C++没有提供这样的功能。p> 另一方面,在某些情况下,操作系统实现的机制接近于
isDefined()


就像在Windows上一样,

< P>已经说过,C++运行时系统不支持查询变量是否声明。一般来说,C++二进制文件不包含关于变量符号或它们的映射到它们的位置的信息。从技术上讲,这些信息将以二进制形式提供,并使用调试信息进行编译,您当然可以查询调试信息,以查看代码中的给定位置是否存在变量名,但这充其量只是一种恶意攻击(如果你好奇地想看看它可能会看到什么,我发布了一个可怕的片段:它使用一个字符串调用C函数,使用Tyrf调试信息。不建议做这样的事情)

< P>微软有两个扩展到C++::它们在某些情况下是有用的,但是它们不接受字符串参数。

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

< P>为了实现这个目标,你需要实现一个动态变量处理系统,或者至少在因特网上找到一些。如前所述,C++被设计成一个本地语言,所以没有。内置的设施可以做到这一点。 对于最简单的解决方案,我可以建议使用字符串键创建一个std::map,用boost::any、wxVariant或类似的东西存储感兴趣的全局变量,并将您的变量存储在此map中。只需一点预处理器指令,就可以根据变量的名称定义变量,这样您就不需要重新键入同时,为了让事情变得更简单,我建议创建一个内联函数来访问这个变量映射,并检查映射中是否包含给定的字符串键。
在许多地方都有这样的功能实现,运行时属性处理系统以不同的方式提供,但如果您只需要此功能,我建议您自己实现,因为这些解决方案中的大多数都是您可能不需要的通用功能。

您可以实现这样的功能,但它不会运行字符串。您必须发送变量名。这样的函数会尝试将0添加到变量中。如果它不存在,则会发生错误,因此您可能希望尝试使用
try…throw…catch
进行异常处理。但由于我在打电话,我不知道在尝试发送不存在项时这是否不会引发错误ng变量到函数…

我相信你的意思是在运行时。实际上,除非我弄错了,否则它是在编译时。sizeof是一个运算符,就像你不能做的那样:如果不定义x,你就不能做sizeof(x)没有定义x。sizeof有什么特别之处?即使您尝试执行任何其他操作,它也不会编译。这就是quid。如果没有定义变量,您将得到一个编译器错误,如果定义它,则不会产生任何副作用,因为sizeof没有编译。这就是我所说的静态检查。编译时检查。静态/动态与此正交问题。静态语言当然可以支持跟踪已知变量的运行时系统。Java作为一种静态语言,可以查询变量是否通过反射定义。Falaina,我不会说它是正交的,但你说的有道理。如果你给我一个更好的术语,我会很高兴,但我不会不高兴enouGH做我自己的研究。哦,是的。正交是有点强的,因为它当然是动态语言中更常见的特征。我相信最接近的术语是“支持反射”,因为我认为这种行为一般被称为反射。是否有人说C++不是反射语言?)-实际上,反射(我想)是一种允许程序根据其结构调整其行为的技术。从某种意义上说,模板元编程使C++反映,只是在编译时发生,它仍然是程序代码,影响了它自己。我想说,我们的讨论可能会偏离正切,超出OP的理解范围(当然,无意冒犯,这是正常的)。我想说,如果你的语言允许这样做(或者就此而言,一般来说,反思),那么它就不是完全静止的。静态语言不允许这样做。Java,因为它支持反射,是一个混合体,有一些动态元素。你觉得这样的构造解决了一个特别的问题吗?请告诉我们为什么你需要测试这个。默认情况下,所有对象都是根据其构造函数定义的。POD类型可能具有随机值,但在没有定义的情况下声明它们被认为是糟糕的编程风格。