2011-09-08 7 views
2

Commenting your Codeセクションで、ポインタと#defineの使用を避けることに気付いたとき、私はArduinoのを探していました。Arduinoでプログラミングするときはポインタと#defineを避けてください。

作者がこれを述べた理由はありますか?なぜ彼/彼女がこれを述べたのかについての説明はない。それは私には意味がありません。これは組み込みシステム特有のものですか?

+7

ほとんどの場合、スタイルガイドは「初心者にやさしい」コードを作成するためのものです。私は 'if(somethingIsTrue == TRUE)'を真剣にお勧めするものを取ることは難しいと思う。どうすればいいのですか(somethingIsTrue == TRUE == TRUE == TRUE == TRUE) '? – Mankarse

+0

良い点。なぜ最初にそれらを言及するのですか?初心者はポインタ/定義について必ずしも知っているとは限りません。あなたの応答に基づいて、私は彼がコンドルをよく知っていて経験を持っていても、arduinoを使うことを学ぶときに合併症を避けるために言っていることを推測しています。 –

+0

@Mankarse:それは '== TRUE''で行が不十分で本当に面白いですから。 – Daniel

答えて

6

著者が書いた具体的な理由はわかりません。私は図書館の書かれたスタイルに慣れていないので、C++プログラムの一般的な言葉で答えるつもりです。

現代のC++は、プリプロセッサと生ポインタによって頻繁に導入される問題を回避または最小限に抑えるように設計された他のイディオムを使用するのが普通です。

は代わりに、ポインタのポインタ

を避け、それがオブジェクトまたはそのようなオブジェクトの集合のためのベクターとしての容器のための基準を使用するC++で従来のものです。生ポインタを扱う場合、特に顧客のコードでは、複雑さや曖昧さの多くが存在する可能性があるため

//////// For an object 
//// Using a pointer 
bool getURL(t_url* const outUrl); 
// In use: 
bool result(obj.getURL(&outUrl)); 

//// versus using a reference 
bool getURL(t_url& outUrl); 
// In use: 
bool result(obj.getURL(outUrl)); 

//////// For a collection 
//// Using a pointer 
bool apply(const double* const values, const size_t& count); 
// In use: 
bool result(obj.apply(array, count)); 

//// versus using a container 
bool apply(const std::vector<double>& values); 
// In use: 
bool result(obj.apply(values)); 

でもポインタがオブジェクトコンテナ(オートポインタ、スマートポインタ、共有ポインタ、弱いポインタ)与えられてもよいです。生ポインタを受け取ったり返すC++プログラムを書くのはまれです。

避けては

プリプロセッサ/定義は、C++で一般的にも好ましい方法ではありません定義します - あなたは、インライン関数、匿名ネームスペース、テンプレート、および列挙型を持っています。

多くの理由で問題となるマクロの普遍的な例は、std::maxと比べて#define max(a,b) ((a > b) ? a : b)です。

結論

私はどちらかのかなりの量を使用してC++プログラムが表示された場合、私は自分自身がそれが書かれた何十年に思って、または著者がもう少しで「Cで書いていたされた場合見つけますフィーチャー "の方言です。

もう1人の回答者は、「アドバイスはごみです。同意しません。 Arduinoのアドバイスは、単に「ポインタを避ける」と「#defineを避ける」と言っています。もちろん、これらの施設を使う必要があるときもありますが、それらを置き換えるための言語や図書館施設を使うときには、(誤った使い方や問題のある一般的な方法で)明確なプログラムを書くことができます。にはを使用しないでください。これを使用することは、より現代的で慣用的な選択肢を好むように、必要な場合に限り、控えめに使用することを意味します。

0

このアドバイスはゴミポインタです。ポインタは非常に便利で強力なツールであり、何かを効果的に処理するためにはしばしば必要です。

#define sが、一方で、多くの場合、インライン関数の賛成で多くの理由(onetwothreefour)のために避けるべきであるが、やはりマクロを使用し、最適なソリューションですしなければならない多くの状況があります。それはあなたの問題にかかっています - スマートで、いつそれらを使うべきか、そうでない時を知っています。盲目的に使用しないでください。

+1

参照(「別のオブジェクトへのエイリアス」として説明されています)は、ポインタ(奇妙な構文と落とし穴が多数あります)よりも初心者が理解しやすいので、参照を使用するとポインタを避けることは良いアドバイスになる可能性があります一方、参照では、渡しているオブジェクトを関数呼び出しで変更できることがすぐにわかりませんが、インタフェースがうまく設計されていれば、どの引数が変更されるのかがはっきりしているはずです) –

関連する問題