6

PHP 有一个非常好的函数,isset($variableName)。它检查 $variableName 是否已经在程序中定义。

我们可以为 C/C++(某种符号表查找)构建类似的功能吗?

4

8 回答 8

12

我是一个 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++ 方式”进行操作。

于 2008-10-23T17:53:37.373 回答
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 中使用的变量,实现需要使用某种变体类型。

于 2008-10-23T18:17:09.713 回答
3

并不真地。您不能在 C 中动态创建变量(尽管您可以使用 malloc() 等人或 C++ 中的 new 等人动态创建存储)。我想动态加载的库会模糊图片,但即使在那里,您建立是否变量的存在是通过查找其名称。如果名称不存在,那么,如果没有运行编译器来创建动态加载的模块然后加载它,您可能会被卡住。这个概念实际上不适用于 C 或 C++。

于 2008-10-23T17:46:04.223 回答
1

正如在其他答案中所说,在 C++ 中,变量永远不会未定义。但是,变量可以未初始化,在这种情况下,它们的内容未在语言标准中指定(并且大多数编译器将其实现为恰好存储在该内存位置的任何内容)。

通常,编译器会提供一个标志来检测可能未初始化的变量,如果启用,则会生成警告。

isset 的另一种用法可能是处理不同的代码。请记住,C++ 是一种静态编译的语言,尝试重新定义符号会导致编译时错误,因此不再需要 isset。

最后,您可能正在寻找的是一个空指针。为此,只需使用一个简单的比较:

int * x(getFoo());
if (x) {
  cout << "Foo has a result." << endl;
} else {
  cout << "Foo returns null." << endl;
}
于 2008-10-23T19:18:54.940 回答
1

那么总会有 Boost.Optional

http://www.boost.org/doc/libs/1_36_0/libs/optional/doc/html/index.html

这几乎应该做你想要的。

于 2008-10-23T19:47:31.467 回答
0

简短的回答:

标准后续问题:你真正想解决什么问题?

于 2008-10-23T19:33:33.180 回答
0

你必须在这里分开两件事:变量声明和变量内容

正如在其他答案中所说,与 PHP 不同,C++ 不允许在声明变量之前使用它。

但除此之外,它可以是未初始化的。

我认为 PHP isset 函数试图找出变量是否具有可用值。在 C++ 中,这最好对应于指针为 NULL 或有效。

于 2008-10-23T19:51:08.057 回答
0

我能想到的最接近的事情是使用指针而不是实际变量。然后你可以检查NULL。

但是,您似乎在为该语言解决错误的问题,或者使用错误的语言来解决您的问题。

于 2008-10-23T21:36:18.750 回答