PHP有一个非常好的函数,isset($ variableName)。它检查$ variableName是否已在程序中定义。
我们可以为C / C ++(某种符号表查找)构建类似的功能吗?
答案 0 :(得分:12)
我是C ++人,但我记得在PHP中,isset用于检查变量是否包含通过get / post请求传入时的值(我确定还有其他用途,但这是常见的我相信)。
你在C ++中没有真正的动态类型。因此,您不能突然使用之前未明确定义的变量名称。在C ++中确实没有“unset”变量这样的东西。
即使你说“int var;”并且不初始化它,变量有一个值,通常是垃圾,但它仍然在PHP意义上“设置”。
关闭我认为是预处理器的#ifdef和#ifndef,只检查你是否使用#define定义了一个变量。但根据我的经验,这主要用于省略或添加基于标志的代码。例如:
// code code code
#ifdef DEBUG
// debug only code that will not be included in final product.
#endif
// more code more code
您可以使用#define定义DEBUG以确定是否现在包含“DEBUG”代码。
或许更多地讲述你试图用C ++等效的isset做什么会让你更好地了解如何去做“C ++方式”。
答案 1 :(得分:5)
在语言中没有直接的方法。但是,可以通过使用如下地图来执行此类操作:
typedef std::map<std::string, int> variables_type;
variables_type variables;
variables["var"] = 1;
if(variables.find("jon") == variables.end())
std::cout << "variable, \"jon\" not set\n";
为了使这个变量像PHP或javascript中使用的那样,实现需要使用某种变体类型。
答案 2 :(得分:3)
不是真的。你不能动态创建变量(虽然你可以用C语言中的malloc()et al或cn中的new等动态创建存储)我想动态加载的库模糊了图片,但即便如此,你确定是否存在的变量是通过查找其名称。如果名称不在那里,那么,如果没有运行编译器来创建动态加载的模块然后加载它,你可能会被卡住。这个概念实际上不适用于C或C ++。
答案 3 :(得分:1)
正如其他答案中所说,在C ++变量中永远不会定义。但是,变量可以是未初始化的,在这种情况下,它们的内容未在语言标准中指定(并且大多数编译器都将其实现为存储在该存储器位置的任何内容)。
通常,编译器会提供一个标志来检测可能未初始化的变量,并在启用时生成警告。
isset的另一种用法可能是处理不同的代码。请记住,C ++是一种静态编译的语言,尝试重新定义符号将导致编译时错误,从而无需使用isset。
最后,您可能正在寻找的是一个空指针。为此,只需使用简单的比较:
int * x(getFoo());
if (x) {
cout << "Foo has a result." << endl;
} else {
cout << "Foo returns null." << endl;
}
答案 4 :(得分:1)
答案 5 :(得分:0)
简短回答:否
标准后续问题:您真的试图解决什么问题?
答案 6 :(得分:0)
你必须在这里分开两件事:变量声明和变量内容。
正如其他答案所述,与PHP不同,C ++不允许在声明变量之前使用它。
但除此之外,它可能是未初始化的。
我认为PHP isset函数试图找出变量是否具有可用值。在C ++中,这最好与指针为NULL或有效。
答案 7 :(得分:0)
我能想到的最接近的事情是使用指针而不是真正的变量。然后你可以查看NULL。
然而,看起来您似乎正在为语言解决错误的问题,或使用错误的语言来解决您的问题。