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

Is it possible to check existance of variables?

本文关键字:存在 变量 检查 是否      更新时间:2023-10-16

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

//..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

No。C和c++不支持反射

不支持C/c++。但是你可以看看boost reflect库。http://bytemaster.bitshares.org/boost_reflect/

在C/c++中,访问未定义的变量会产生编译错误。所以,从某种意义上说,这是它运作的固有方式。你不能在运行时这样做,至少不是你想做的,也不应该需要这样做——因为你不能在运行时首先命名新变量,所以你应该已经知道那里的变量。

唯一的方法是间接地使用宏。宏不能检查变量本身是否已定义,但可以将定义与变量定义配对,并且可以检查define标记。

#define A_VARIABLE 1
int a_variable = 60;

,后来:

#ifdef A_VARIABLE
...
#endif

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

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

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

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

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

由于现在任何名称都已被存储位置和执行起点的引用所取代,可执行文件不再知道程序文本中用于引用其存储位置和函数的名称。

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