0

条件演算子が実際に他の無関係なコードの動作を防ぐことができるかどうか疑問に思っています。以下に例を示します。

typedef char WCHAR_T;
#define STRLEN(x) strlen(x)
if (argc > 2)
{
    WCHAR *pFileName = argv[1];
    basic_string <WCHAR> strFileName(pFileName, STRLEN(pFileName));
}

上記のコードでは、pFileName、argv[1]、および strFileName は比較とは関係ありませんargc > 2。コマンドライン引数が完全に問題ないと仮定します。ただし、このコードはその比較では機能しません。また、コードを次の形式に変更しても:

typedef char WCHAR_T;
#define STRLEN(x) strlen(x)

{
    WCHAR *pFileName = argv[1];
    basic_string <WCHAR> strFileName(pFileName, STRLEN(pFileName));
}

それでもうまくいきません。編集:「機能しない」とは、コンパイラが「strFileName」が宣言されていないなどのエラーメッセージを表示することを意味します。これは、この宣言がまったく実行されなかったことを意味します。

中括弧がコードに大きな影響を与える理由がわかりません。中括弧を取り除くと、コードは魔法のように機能します...誰か説明してもらえますか? ありがとう。

4

3 に答える 3

6

strFileName中括弧内にのみ存在するためです。中括弧はスコープを定義し、ローカル変数はそれらが定義されているスコープ内でのみ認識されます。

于 2012-06-15T00:55:50.753 に答える
1

中括弧の外のどこかから変数を使用しようとしていると思いますがstrFileName、これは不可能です。

{および中括弧はブロックを定義し、}内部で宣言された変数はこのブロック内にのみ存在します。strFileName回避策は、ブロックの外側で宣言し、その値を内側から割り当てることです

typedef char WCHAR_T;
#define STRLEN(x) strlen(x)

basic_string <WCHAR> strFileName;

if (argc > 2)
{
    WCHAR *pFileName = argv[1];
    strFileName.assign(pFileName, STRLEN(pFileName));
}

std::cout << strFileName << std::endl; // should work now
于 2012-06-15T01:00:41.627 に答える
0

WCHAR_T の定義が表示されますが、コードで使用されているのは WCHAR です。WCHAR はどこかに定義されていますか?

于 2012-06-15T00:59:30.860 に答える