PHP 有一个非常好的函数,isset($variableName)。它检查 $variableName 是否已经在程序中定义。
我们可以为 C/C++(某种符号表查找)构建类似的功能吗?
PHP 有一个非常好的函数,isset($variableName)。它检查 $variableName 是否已经在程序中定义。
我们可以为 C/C++(某种符号表查找)构建类似的功能吗?
我是一个 C++ 人,但我记得在 PHP 中 isset 用于检查通过 get/post 请求传入时变量是否包含值(我确信还有其他用途,但我相信这是一个常见的用途) .
您在 C++ 中并没有真正的动态类型。所以你不能突然使用一个你以前没有明确定义过的变量名。C++ 中确实没有“未设置”变量之类的东西。
即使你说“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”代码。
也许更多地讲述您尝试使用与 isset 等效的 C++ 所做的事情,会让您更好地了解如何以“C++ 方式”进行操作。
在语言中没有直接的方法可以做到这一点。但是,可以通过使用如下映射来执行此类操作:
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 中使用的变量,实现需要使用某种变体类型。
并不真地。您不能在 C 中动态创建变量(尽管您可以使用 malloc() 等人或 C++ 中的 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。
但是,您似乎在为该语言解决错误的问题,或者使用错误的语言来解决您的问题。