是否可以检查变量的存在?

时间:2015-05-22 20:35:15

标签: c++ c variables exists

我们能否理解是否存在提及/创建/存在的变量? 我的意思是这样的:

//..Some codes
int main(){
    int var1;
    float var2;
    char var3;
    cout << isExist("var1") << endl;//Or isExist(/*Something related with var1*/)
    cout << isExist("var2") << endl;
    cout << isExist("var3") << endl;
    cout << isExist("var456") << endl;//There is no variable named with var456
    return 0;
}  

输出:

true
true
true
false

4 个答案:

答案 0 :(得分:7)

没有。 C和C ++不支持reflection

答案 1 :(得分:0)

不在C / C ++中。但你可以看一下boost反射库。 http://bytemaster.bitshares.org/boost_reflect/

答案 2 :(得分:0)

在C / C ++中,访问未定义的变量将生成编译器错误。因此,从某种意义上说,这是它的工作原理所固有的。你不能在运行时这样做,至少不是你想做的,而且不应该 - 因为你不能在运行时首先命名新的变量,所以你应该已经知道那里的变量。

执行此操作的唯一方法是间接使用宏。宏无法检查变量本身是否已定义,但定义可以与变量定义配对,您可以检查定义标记。

#ifdef A_VARIABLE
...
#endif

后来:

    <telerik:RadRichTextBox
        x:Name="RichTextBox"
        IsSpellCheckingEnabled="False"
        Loaded="RichTextBox_Loaded" />
    <telerik:HtmlDataProvider
        RichTextBox="{Binding ElementName=RichTextBox}"
        Html="{Binding Html, Mode=TwoWay}" />

与大多数宏一样,最好避免这种行为 - 但是,我已经看到它用于处理某些变量的平台依赖性。

动态记忆是另一回事。既然你没有提到它,我就不会进入它,但足以说它是一个更复杂的问题,证明了许多程序员的祸害和许多运行时错误的来源。

答案 3 :(得分:0)

“编程语言C”是向计算机提供指令的人类可读形式。程序中的所有名称仅在程序文本中有意义。

编译时,名称将替换为存储位置或函数的符号引用(执行起始点)。在当前的complilation单元(对象模块)中找不到任何符号,以便将来解析。

将对象模块组合(链接)到可执行文件中,其中对不在对象模块中的符号的所有引用都使用其他对象模块中的位置来解析;否则,可执行文件的创建失败。

由于现在任何名称都已替换为对存储位置和执行起始点的引用,因此可执行文件不再了解程序文本中用于引用其存储位置和功能的名称。

任何这样做的能力(用户@ Bill-Lynch称之为'反射')将作为单独的层“固定”到语言/环境,例如由调试/开发环境提供。