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

 

実行時の二重のエラー

#define  XY( X, Y )      X##Y
#define  f( X )  XY( g, X )
#define  MACRO1( X )     #X
#define  MACRO2( X )     MACRO1( X )
#define  SIZE    5
void OnStart()
{
    printf( "%s", MACRO2( f( SIZE )));
}

結果:f(SIZE)

本来はg5

 
leonerd:

テストの可視化グラフから矢印を削除するにはどうすればよいですか?テストを始める と、前回のテストでの入力の矢印や線が残っています。

tester.tpl テンプレートをクリーンアップしてください、オブジェクトはおそらくそこにあります。

 
A100:

実行時の二重のエラー

結果:f(SIZE).

こうあるべき: g5


私には論理的な結果のように思えます。

 
fxsaber:
私には論理的な結果のように思えます。

予想:最初に内部マクロ SIZE を代入し、次に中間マクロ f( X ) を代入し、最後に外部マクロ MACRO2( X ) を代入する。

しかし、不完全なロジックを使っても結果は違う。

#define  MACRO1( X )     #X
void OnStart()
{
    printf( "%s", MACRO1( f( SIZE )));
}
//Результат  :f(SIZE)
//должен быть:f( SIZE )

少なくとも、スペースに違いがある

 
A100:

予想:最初に内部マクロ SIZE を代入し、次に中間マクロ f( X ) を代入し、最後に外部マクロ MACRO2( X ) を代入する。

しかし、不完全なロジックを使っても結果は違う。

少なくとも、空白部分に違いがあります。

機能の優先順位は、もちろん内側から外側へ。一方、マクロの場合はその逆です。

#Xは スペースを含まない文字列です。もちろん、これには異論もあるでしょう。

 
fxsaber:

機能の優先順位は、もちろん内側からです。一方、マクロはその逆です。

#Xは スペースを含まない文字列です。もちろん、これに反対することもできます。

しかし、なぜ、古い表記で複雑なルールを新たに作らなければならないのでしょうか。すでに、そのような表記で、広い範囲の人々に知られ、何十年も確立されているシンプルな古いルールがあるのに。ルールが新しくなれば、呼称も新しくなるはずです

 
A100:

実行時の二重のエラー

結果:f(SIZE)

本来はg5

1年前にも同様の依頼をサービスデスクにしましたが(#1600034)、いまだに回答がありません。このような「マニアック」なバグは一切気にしていないようです。そして、一般的に、言語は、すべてから判断して、改善するつもりはありません。大きなバグの修正のみで、それ以上はありません。
 
A100:

何十年もかけて確立され、多くの人に知られているシンプルなルールがあるのに、なぜ古い呼称で新しい複雑なルールを作るのでしょうか?ルールが新しくなれば、呼称も新しくなるはずです。

具体的にはどのようなことでしょうか。どうあるべきか?

 
fxsaber:

具体的にはどのようなことでしょうか。そして、どうあるべきなのか。

#Xは そのままの文字列、つまりスペース(あれば)を含む文字列です。また、上記の f( SIZE ) → g5の例を見てください。これらのルールは私が考案したわけではなく、C++コンパイラがそうしているのです

 
Alexey Navoykov:
1年前にも同様の依頼をサービスデスクに送ったが(#1600034、いまだに回答はない。このような「マニアック」なバグは一切気にしていないようです。そして、一般的に、言語は、すべてから判断して、改善するつもりはありません。大きなバグを修正するだけで、それ以上のことはしない。

昨日、偶然に出会ったのですが、なんと連動していることに驚きました。

template<typename T, int n>

数十行のコードが文字通り1~2行になった(!)。だから書いたのですが......一見すると、些細なことかもしれません。改めてC++にナンセンスはないと確信しました