#define dItemName L"CellPhone"
答えて
定数変数として定義します。それは良いプログラミング実践です。
const wchar_t dItemName[] = L"CellPhone";
また、の#defineが悪い理由:それはあなたが使用するすべての場所を変えるあなたは、配列として定義、どこかに後で文字列のな長さを知っておく必要がある場合には
const wchar_t *dItemName = L"CellPhone";
単語dItemNameをL "CellPhone"に変換します。例:
struct {
int dItemName;
} SomeStruct;
は無効となります:#define
と
struct {
int L"CellPhone";
} SomeStruct;
まあ、リテラルはすでに強く型付けされていますが、alaです。あなたはa *がありません。 –
'*'や 'std :: wstring'を忘れましたか? –
あなたは正しいです、*が追加されました。 –
一つの大きな問題は、言語自体の外にあり、したがって、与えられた範囲に限定されないことです。あなたは、私がconst std::wstring dItemName = L"CellPhone";
#define
マクロを定義するプリプロセッサ命令であると交換したいなど
すべての名前空間、クラス、関数内の翻訳単位でdItemName
どこでも、置き換えられます。あなたのケースではdItemName
マクロの値はL"CellPhone"
です。
マクロは、実際のコードが処理される前に処理されているために悪いです。これは、スコープとC++構文の規則に従わないことを意味します。 dItemName
という名前の変数がある場合は、おそらく動作しません。そのため、コンパイルエラーが分かりにくいでしょう。
解決策は、dItemName
を変数(この場合はconst
変数)として宣言することです。
あなたが作成したプリプロセッサマクロはすべての名前スコープを汚染するので、それらはどこにでもあり、標準的な命名範囲ルールに従わない。したがって、そのようなマクロでは、の代わりにint dItemName = 5;
のようなコードがプリプロセッサによってf'edされます。定数のグローバル変数はこれをしません。
他のすべての問題はさておき、これはIMNSHOのマクロ定義の問題です。
私はすべての欠点を指摘している1つの質問を見つけることができませんでした。
まず、C
(これはC++ではありません)ではなく、定数を宣言する方法です。なぜなら、多くのC++開発者がCのバックグラウンドを持ち、Cのバックグラウンドを持つ人々から教えられた/教わったことがあったとき、彼らはこのC-ishの振る舞いを再現する傾向があります。
しかし、C++では優れた機能を備えています。
:#define
は定数を定義していない、それはマクロがない範囲
- を規定する安全
を入力されていないマクロには範囲を知りません
これらはプリプロセス機能です。プリプロセッサは、基底言語(asm、CまたはC++のいずれか)の規則を認識せず、常にシンボルを展開しますそれはスコープを考慮しないで在庫があります。このため
は、通常のマクロを離れて設定するシンボルの特定のセットを使用することをお勧めします。人々は一般的に、あなたがそれを覚えておく必要があるものの、ALL_CAPS
記号を使用しています。
- 彼らはアンダースコアCに準拠するために
ことから始めるべきではありません
マクロは、タイプセーフではありません。
私が言ったように、プリプロセッサは、基礎となる言語規則を無視し、したがって、以下の奇妙なとしてそれに当たらない:
:一方#define FOO "foo"
int main(int argc, char* argv[])
{
if (FOO) { ... }
return 0;
}
を、適切な型を使用すると、この意図しないミスを防止するであろう
std::string const Foo = "foo";
結論?
あなたが望むなら、それはちょうどあなたの代わりに、コンパイラの余分な作業をやっている#define
を使用することができますが、それはあなたの呼び出しです。個人的に:私は怠け者だ:)
私はobj-cの開発者ですが、最近は定数を定数変数に変換し始めています(Al Keppの答えを参照)。これは最初に定義されたマクロです。コード実行と定数定義でない場合は、#define?(特に、obj-cでは特にない)を使用するのがよいでしょうか? –
@YunusNedimMehel:主な使用例はロギングマクロです。ロギングが呼び出されるポイントで '__FILE__' /' __LINE__'へのアクセスを望むなら、関数はインラインでさえ、ポイントからではなく、定義されているところで '__FILE__/__LINE__'を使用するので、マクロが必要です-of-use。同様に、関数内のクリーンアップセクションの名前に対してプロジェクト全体の規約を持つC(C++で/RAⅡ&例外では重要ではない)の場合、チェックを返すマクロとクリーンアップセクションは 'goto'ではありません恐ろしい(代わりのものは矢印パターンです)、マクロだけが使用時点のスコープで「動く」ことができます。 – ShadowRanger
は、障害があると彼らはのために発明ところ何を定義するためにポインティング - だけでなく、切削用ナイフを非難します。
UPPERCASE_NAMESを使用して定義を正しく指定しないと、問題が発生しますが、作業スタイルを自習することができない場合は、C言語で問題が発生します。
constを使用して動的再配列システムを生成することはできません。そのため、組み込みアプリケーションには適していません。使用法にあらかじめコンパイルしておく必要があります。事前評価定数だけを割り当てることができます。ツールdoeseがOO-パラダイムのは突然無駄にならないに屈するないという理由だけで
。 Constは、機能に関しては等価置換ではありません。
- 1. T-SQLのカーソルに最適な代替品は何ですか?
- 2. #defineの#ifに最適な代替手段
- 3. なぜABRecordCopyCompositeNameがNULLで、何が代替ですか?
- 4. githubに適切なフォルダ構造がないと実行可能な代替手段は何ですか?
- 5. なぜ悪い代用ですか?
- 6. Braintreeの代替品や、任意の適切な組み込みチェックアウト?
- 7. Greasemonkeyのシンプルな代替品
- 8. Define()(PHP)ASP.NET(C#)の代替
- 9. 適切なLLVMヘッダーガードスタイルは何ですか?
- 10. 不適切なリストは何ですか?
- 11. cbDSMixerの現代的な代替品ですか?
- 12. 不適切な製品を
- 13. PHPで 'require_once'などの代替品を書くことは可能ですか?
- 14. HBITMAPを描くためにStretchBltに代わる高品質の代替品は何でしょうか?
- 15. HybrisのPKアナライザーの代替品は何ですか?
- 16. C#のイオンジップの代替品は何ですか?
- 17. iphone用キーボードの代替品は何ですか?
- 18. 良いIntel XDKの代替品は何ですか?
- 19. redux-sagaはミドルウェアの効率的な代替品ですか?
- 20. monoはasp.netの実行可能な代替品ですか?
- 21. elasticsearchで並べ替える適切な方法は何ですか?
- 22. DataGridはUWPの代替品ですか?
- 23. ファイルアソシエーションのためのddeの最適な.net代替手段は何ですか?
- 24. #defineとtypedefオペランドが逆になるのはなぜですか?
- 25. Mootools MochaUIに代わるJqueryの代替品とは何ですか?
- 26. NAnt代替品
- 27. 代替品
- 28. シャープアーキテクチャー代替品
- 29. asmxはxmlの代替品とみなされますか?
- 30. PowerShellが適切なCrumbを送信できないのはなぜですか?
http://stackoverflow.com/questions/3474949/over-reliance-on-macros/3475032#3475032 – DumbCoder
Scott Meyersの「Effective C++」をチェックしたいと思うかもしれません。私は第3版が最新版だと思います。彼はこれと他の多くの同様のC++の問題に対処する素晴らしい仕事をしています。 – westsider
この 'dItemName'の使用方法は?例を追加してください。 – i486