是否可以检查变量的存在性
Is it possible to check existance of variables?
我们能理解是否有一个变量被提及/创建/存在吗?
我的意思是这样的:
//..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称之为"反射")都将作为一个单独的层"固定"在语言/环境上,例如由调试/开发环境提供。
- 为什么我的变量存在于其范围之外
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- 如何从文件中存在的路径中检索环境变量
- 如何通过结构中的变量找出结构向量中是否存在结构
- VS 中的 C++ 17 会导致 C++14 中不存在的变量(重新)评估错误
- OpenACC vs C++:致命错误:设备上部分存在变量
- 变量在临时存储中存在多长时间
- 对条件表达式结果的赋值(其中第二个和第三个操作数是相同类型和值类别的变量)是否仍然存在?
- 根据成员变量的类型是否存在,有条件地定义该变量
- SFINAE:检测成员变量的存在在 g++ 上不起作用
- 返回成员变量(如果存在)
- 为什么堆栈中的函数局部变量之间存在内存空间
- 原子线程围栏:为什么在这个非原子变量上存在数据竞争?这有关系吗
- 当变量仍然存在时调用C++析构函数
- c++11 lambda 真的支持闭包吗?函数变量中存在语义冲突
- 是否存在32位变量无法正确对齐的情况
- 防止变量脱离范围,因此它们仍然存在另一个线程
- 当只有一个线程写入 c++ 中的布尔变量时,是否存在争用条件
- 保存在 16 位的双变量样本中
- 如何检查 std 中是否存在变量或函数?(在 C++ 中)