0

Cプリプロセッサで少し遊んだ後、次のように定義された、制御構造を持つPythonianに似たものを作成する方法を考えました。

#define with(var) for(int i##__LINE__=0;i##__LINE__<1;)for(var;i##__LINE__<1;++i##__LINE__)

使用例:

#include <cstdio>
#include "FileClass.hpp"
#include "with.hpp"

int main(){
    with(FileClass file("test.txt")){
        printf("%s\n",file.readlines().c_str());}
    return 0;}

二重にネストされたforループには、内側のループで1回インクリメントされて中断される、外側の難読化された反復変数があるという考え方です。これにより、スコープ内にvarを指定して次のコードが1回実行されます。

これには欠点がありますか?反復変数を十分に難読化すると、名前が衝突する可能性はほとんどなくなり、バックファイアの可能性がないように見える方法で標準のプリプロセッサ機能のみが使用され、非常に理解しやすくなります。

それはほとんど真実ではないようです-これがどこでも使用されていない理由はありますか?

4

5 に答える 5

6

これがどこでも使用されていない理由はありますか?

はい、C ++はPythonではありません。コードを正しく理解していれば、これはまったく同じです。

{
  FileClass file("test.txt");
  printf("%s\n", file.readlines().c_str());
}

それで、欠点は何ですか?不自然な構文、コード難読化のためのプリプロセッサの使用、はるかに多くの定型コードで上記と同じことを達成し、C++を一義的に使用します。十分?

C ++には、値型とスタック変数のスコープベースの決定論的破棄という非常に重要な概念があります。これは、SBRM(スコープにバインドされたリソース管理、RAIIとも呼ばれる)のような非常に重要なイディオムにつながります。

于 2011-12-17T03:33:31.640 に答える
4

これは、Cで記述された元のBourneシェルで使用されていたマクロと精神的に似ています。これらは、Bourneの優先言語であると思われるAlgol68と同様の構文を提供することを目的としていました。

http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.hからの小さなサンプル:

#define IF    if(
#define THEN  ){
#define ELSE  } else {
#define ELIF  } else if ( 
#define FI    ;}

その結果、Cプログラマー(マクロとC自体の構文に精通している必要がある)、Algol 68、またはPythonプログラマーのいずれかにとって読みにくいコードになる傾向があります。

あなたのwith()マクロを使用するC++プログラムを読んだ場合、(a)それがマクロであることに気づかずにwith()(マクロには通常すべて大文字の名前が付けられます)、(b)マクロ定義を追跡し、そして(c)マクロを展開した結果として生じるかなり奇妙なCコードを解読する。withこれは、それがコンパイラ固有の拡張機能である、またはCに私が知らなかったステートメントがあると考える罠にはまらないことを前提としています。

または、Pythonwithステートメントを理解している場合でも、(a)with()マクロがPythonwithステートメントを模倣することを目的としていることを認識し、(b)正しく理解できることを信頼する必要があります。

数年前、私はこれを考えました:

#define ever ;;
...

for (ever) { ... }

とても賢かった。私はまだそれが賢いと思います。しかし、私はもはや賢さはそれほど良いことだとは思いません。

于 2011-12-17T03:44:30.537 に答える
1

それはほとんど真実ではないようです-これがどこでも使用されていない理由はありますか?

確かに、それはあなたにとってうまく機能する素晴らしい構造ですが、チームの他の人々はどうですか?あなたが書いたかわいいマクロを思い出せない、6か月後のあなたの未来はどうですか?

要するに、このような構文体操は家庭では素晴らしいエクササイズですが、コラボレーション環境ではひどいものであり、将来的にはあなただけが維持するコードにとってもひどいものです。ベストプラクティスに固執すれば、コードの保守と理解がはるかに簡単になります。

それはあなたが家でこの種のことをするべきではないということではありません。あなたが楽しんでいることをして、あなたの脳をしなやかに保ちなさい。ただし、本番環境ではウォームアップ演習を使用しないでください。

于 2011-12-17T03:38:00.793 に答える
1

これは本当に「with」ですか?Pythonの「with」の大きな利点は、「with」ステートメントの変数を自動的に閉じる/解放する/ロックを解除する/割り当てを解除するコンテキストマネージャーと連携することです。C ++には、これを行うための標準的な方法があります。たとえば、auto_ptrnewで割り当てられたポインタの自動削除を処理します。自分で再発明する前に、これらの標準的なイディオムを学びましょう。

于 2011-12-17T03:45:03.297 に答える
0

これの明らかな欠点は、誰もあなたのスパゲッティのろくでなしのPython-in-C++コードを読むことができないということです。そのコードを維持するために頑張ってください。

于 2011-12-17T03:34:58.163 に答える