在C / C ++中PHP的isset()的副部分
PHP有一个非常好的函数,isset($ variableName)。 它检查是否已在程序中定义$ variableName。
我们可以为C / C ++(某种符号表查找)构建类似的function吗?
我是一个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 ++方式”。
在语言中没有直接的方法。 但是,可以通过使用如下地图来执行此类操作:
typedef std::map variables_type; variables_type variables; variables["var"] = 1; if(variables.find("jon") == variables.end()) std::cout << "variable, \"jon\" not set\n";
为了使这个变量像PHP或javascript中使用的那样,实现需要使用某种变体类型。
并不是的。 你不能动态地创建变量(尽管你可以用C语言中的malloc()et al或cn中的new等动态创建存储)。我认为动态加载的库模糊了图片,但即使在那里,你确定是否存在的变量是通过查找其名称。 如果名称不存在,那么,如果没有运行编译器来创建动态加载的模块然后加载它,那么您可能会陷入困境。 这个概念确实不适用于C或C ++。
正如在其他答案中所说,在C ++变量中永远不会定义。 但是,变量可以是未初始化的,在这种情况下,它们的内容未在语言标准中指定(并且大多数编译器都将其实现为恰好存储在该存储器位置的任何内容)。
通常,编译器提供一个标志来检测可能未初始化的变量,如果启用此选项,则会生成警告。
isset的另一个用法是处理不同的代码。 请记住,C ++是一种静态编译的语言,尝试重新定义符号将导致编译时错误,从而无需使用isset。
最后,您可能正在寻找的是空指针。 为此,只需使用简单的比较:
int * x(getFoo()); if (x) { cout << "Foo has a result." << endl; } else { cout << "Foo returns null." << endl; }
好吧总有Boost.Optional
http://www.boost.org/doc/libs/1_36_0/libs/optional/doc/html/index.html
这应该几乎做你想要的。
简答: 没有
标准后续问题:您真正想解决的问题是什么?
你必须在这里分开两件事:变量声明和变量内容 。
正如其他答案所述,与PHP不同,C ++不允许在声明变量之前使用它。
但除此之外,它可能是未初始化的。
我认为PHP isset函数试图找出变量是否具有可用值。 在C ++中,这最好与指针为NULL或有效。
我能想到的最接近的事情是使用指针而不是实际变量。 然后你可以检查NULL。
但是,您似乎正在为语言解决错误的问题,或使用错误的语言来解决您的问题。