エラー、バグ、質問 - ページ 2865

 

マーケットプレイス用の新しい製品を作成することは不可能です、エラー500と表示されます。

製品を作成し、確認したところ、公開されたと表示されましたが、リンクをクリックすると500という答えが表示されます。

 
fxsaber:

テキストの置き換えとしてトップダウンで動作します。すなわち、"TMP "は "VALUE "に置き換わる。

ウラジミール・シマコフ

これはコンパイラーではなく、プリプロセッサーです)

になる。

であり、VALUEは未定義である。

undefはどのように機能することになっているのですか?

 
Andrey Khatimlianskii:

undefはどのように機能することになっているのですか?

ここまでは、「テキストの置き換え」が行われています。

 
Vladimir Simakov:

コンパイラーではなく、プリプロセッサーです)

になる。

であり、VALUEは未定義である。

#define  VALUE (VALUE*2)

正しく理解すると、VALUE*2 の値型は const で、置換自体と結びついている、つまり、VALUE も定数である。コンパイラは2つの定数を作成します。

もしそうなら、新しい代入を作成しているはずです。

#define  VALUE1 (VALUE*2)
#define  VALUE VALUE1

また、コード上のVALUEが定数として定義されていた場合、正しくありません。

 
fxsaber:

ここまでは「テキストの置き換え」が行われている。

一致しない、後の行「#define VALUE (TMP*2)」でTMPをVALUEに 変更する。

 
Andrey Khatimlianskii:

辻褄が合わない、後の行「#define VALUE (TMP*2)」でTMPをVALUEに 変更。

#define  MACROS TEXT
 // В этом интервале везде идет замена в исходнике MACROS на TEXT, как делалось бы в текстовом редакторе.
#undef  MACROS
そして、すべての置換が完了するまで、置換が続く。
 
fxsaber:
そうして、代用品が延々と続き、すべてが終了する。

コードがあります。

#define  VALUE 10       // 
#define  TMP VALUE      // 
#undef  VALUE           // 
#define  VALUE (TMP*2)  // 

最初の置換は、#undef VALUEまでのコード全体でVALUEを10に変更し、これを残しています。

#define  TMP 10
#define  VALUE (TMP*2)

次の置換でTMPは10になる。それが判明したのは

#define  VALUE (10*2)

私はどこで間違っているのだろう?

 
Andrey Khatimlianskii:

コードがあります。

最初の置換は、#undef VALUEまでのコード全体でVALUEを10に変更し、これを残しています。

次の置換でTMPは10になる。それが判明したのは

私は何を間違えているのだろう?

TMPに代入されるのは10ではなく、VALUEなのですが、後でVALUEが定義されると(面倒ですが)10になります。

ステップバイステップでご覧ください。

#define  VALUE 10        
#define  TMP VALUE       
#undef  VALUE            
#define  VALUE (TMP*2)

void OnStart(void)
{
   Print(VALUE)
}

プリプロセッサーは、忠実にPrint

Print((TMP*2));

そしてまた、何のトリックもなく、何を代用するのか?そうですね。

Print((VALUE*2));

で、プリプロセッサのディレクティブをすべて消してしまい、その後に初めてコンパイラがこれを取得します。

void OnStart(void)
{
   Print((VALUE*2));
}
 
Vladimir Simakov:

TMPは10ではないが、VALUEがTMPに代入され、その後VALUEが定義されると(これは問題だが)10になる

ステップバイステップでご覧ください。

プリプロセッサーは、忠実に Print

そしてまた、何のトリックもなく、何を代用するのか?そうですね。

で、プリプロセッサのディレクティブをすべて消してしまい、その後に初めてコンパイラがこれを取得します。

これを「トップダウン」とは言いません。

 
Andrey Khatimlianskii:

トップダウンとは言いません。

すみません、説明しようとして混乱しました)))

もう1度

#define  VALUE 10        
#define  TMP VALUE       
#undef  VALUE            
#define  VALUE (TMP*2)

2回目のVALUE定義の時点では、VALUEマクロは定義されていないので、VALUEは次のように定義されます。

(VALUE*2)

なぜなら、TMPは昔も今もVALUEで定義されているからです。

しかし、TMPは、2つ目のVALUEの定義の後、次のように展開される。

(TMP*2)

(こんな感じ))

プリプロセッサは持っているものを埋めるだけで、どこでどのように定義されているかは関係ないのです。そのため、注意しなければならないことがあります。例

#define  min(A,B) ((A)<(B)?(A):(B))

long Foo(int x) {return x*x;}

void OnStart(void)
{
   int a=500,
       b=20;
   Print(min(500,Foo(b))); //400
}

そして今度は、この関数に邪悪なもの、つまり副作用を追加してみましょう。

#define  min(A,B) ((A)<(B)?(A):(B))

long Foo(int x){
   Print("Увидивший это второй раз - нубяра vulgaris");
   return x*x;}

void OnStart(void)
{
   int a=500,
       b=20;
   Print(min(500,Foo(b)));
}

また、これはあくまで銘板ですが、この機能に依存する預金であればどうでしょうか。