2012-03-25 15 views
3

私はこのように動作しますデバッグ機能マクロをしたい:の#define機能で文字列リテラルとしてシンボル名を使用してマクロ

int myVar = 5; 
PRINTVAR(myVar); // macro 

// which expands to something like... 
print("myVar: "); 
println(myVar); 

基本的に、私は、文字列リテラルと同様に、変数などの識別子を使用したいです。

私はstdoutにたくさんの変数をダンプしたいときにちょっと病気になります。

私の愚かな試み、もちろん動作しません:

#define PRINT_VAR(x) Serial.print("x: "); Serial.println(x); 

これは可能ですか?

+2

マクロにセミコロンを埋め込むことには非常に注意する必要があります。あなたは確かにどこでもあなたが書いたものを使うことはできませんでした。通常、マクロ呼び出しの後にセミコロンがあるので、展開には2つのセミコロンが連続しています。 2番目のセミコロンは空文の終わりを示すため、文法エラーではありません。 'do {Serial.print(" x: ");}を使うことを検討してください。 Serial.println(x); } while(0) 'イディオムセミコロンを使用する必要がある場合。少なくとも1つの答えは、代わりにコンマ演算子を使用してセミコロンを注意深く避けることに注意してください。 –

+0

@JonathanLefflerヒントをお願いします!私はコンマに気づいた、意味をなさない。 – aaaidan

答えて

10

「文字列化演算子は、」まさにこのケースのために設計されています:あなたのコードの例を与える

#define PRINT_VAR(x) (print(#x ": "), println(x)) 
+0

うわー、wth。コンマはなぜそこで動作しますか?誰がそれを手に入れる?プリプロセッサまたはコンパイラ? – enigmaticPhysicist

+0

@enigmaticPhysicist:C言語の演算子の1つはカンマ演算子で、形式は「,」です。左手の式を評価し、シーケンスポイント(すべての副作用が解決される)を持っていて、右手の式を評価します。演算子の結果と型は、右手式の結果と型と同じです。関数呼び出しに対する引数リストのカンマはカンマ演算子ではなく、句読点だけであることに注意してください。 – caf

0

あなたがCやJavaの話をしている場合、私は知りません。しかし、ここで私はCでやるです:

#define DEBUG(X, ...) fprintf(x, __VA_ARGS__); 

そして、それを使用する:

DEBUG(srderr、 "私のエラー\ nを");

+0

私は変数名を出力するためにデバッグするときに2回入力することを避けたいという疑問を明確にしておくべきでした。そしてはい、Cは正解です!歓声 – aaaidan

2

stringifying operatorを参照してください。#が付いているマクロIDを使用すると、展開する代わりに文字列として配置されます。

+0

ブリリアント。参照を含めてくれてありがとう。 – aaaidan

+0

電話機のエディタが私にリンクを埋め込ませてくれないか、私はより良い仕事をしたでしょう。それを修正する時間。 – gbjbaanb

関連する問題