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 が不要になることに注意してください。

最後に、探しているのは null ポインターです。そのためには、単純な比較を使用してください。

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

ここでは、変数の宣言と変数の内容の 2 つを分離する必要があります。

他の回答で述べたように、PHP とは異なり、C++ では変数を宣言する前に使用することはできません。

しかし、それとは別に、初期化されていない可能性があります。

PHP isset 関数は、変数に使用可能な値があるかどうかを調べようとしていると思います。C++ では、これはポインターが NULL または有効であることに最もよく対応します。

于 2008-10-23T19:51:08.057 に答える
0

短い答え:いいえ

標準的なフォローアップの質問:本当に解決しようとしている問題は何ですか?

于 2008-10-23T19:33:33.180 に答える
0

私が考えることができる最も近いことは、実際の変数ではなくポインターを使用することです。次に、NULLをチェックできます。

ただし、その言語で間違った問題を解決している、または間違った言語を使用して問題を解決しているように見えます。

于 2008-10-23T21:36:18.750 に答える