前提・実現したいこと
プログラム先頭に #define DEBUG があれば、ifdef と 同じように働き printf が呼ばれ、なければ何も起こらないような マクロを考えています。
発生している問題・エラーメッセージ
構文エラー: '==' 構文エラー: 'else'
該当のソースコード
c
1#include<stdio.h> 2#define DEBUG 3#define Debug(a,n) do{if(n==DEBUG){printf("%d",a);}else{}}while(0) 4int main() { 5 int a = 3; 6 Debug(a, DEBUG); 7 return 0; 8}
試したこと
DEBUGをダブルコーテーションで囲ったりなど
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
#ifdef
で切り替えればいいんじゃないでしょうか。
C
1#include <stdio.h> 2#include <stdlib.h> 3 4#define DEBUG 5 6#ifdef DEBUG 7#define DebugPrint(...) printf(__VA_ARGS__) 8#else 9#define DebugPrint(...) 10#endif 11 12int main(void) 13{ 14 DebugPrint("Hello World!\n"); 15 return 0; 16} 17
投稿2019/07/07 15:16
総合スコア28660
0
マクロを展開して考えてみましょう。
if(n==){printf("%d",a);}else{}
DEBUG
は「空文字列」ではなくゼロバイトの文字列でソースコード上置換されますよね。
全部マクロ展開するとこんな感じ。
c
1#include<stdio.h> 2int main() { 3 int a = 3; 4 do{if(==){printf("%d",a);}else{}}while(0); 5 return 0; 6}
投稿2019/07/07 15:17
編集2019/07/07 15:34総合スコア6753
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/07 15:31
2019/07/07 15:34
2019/07/07 15:34
2019/07/11 17:11
0
簡単化が目的なら、Zuishinさんのコードのように素直に#ifdef
を使った方が良いと思うのですけどねえ。読みやすいし。
c
1#include <stdio.h> 2 3#define DEBUG 4 5#define DBGPRINT(a) DBGPRINT1_(a, DEBUG) 6#define DBGPRINT1_(a, d) DBGPRINT2_(a, d) 7#define DBGPRINT2_(a, d) DBGPRINT_##d(a) 8 9#define DBGPRINT_DEBUG(a) 10#define DBGPRINT_(a) printf("%d\n", a) 11 12int main() 13{ 14 DBGPRINT(100); 15 return 0; 16}
投稿2019/07/08 04:50
総合スコア5938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
#ifdef
を使った方が良いと思いますが、使わない縛りの場合、次のような方法もあります。
C
1#include<stdio.h> 2#define DEBUG 3 4#define DEBUGSTAT 0 5#define STAT 1 6#define HELPER_I(N) N ## STAT 7#define HELPER(N) HELPER_I(N) 8#define Debug(a) do{if(HELPER(DEBUG)){printf("%d",a);}else{}}while(0) 9int main() 10{ 11 int a = 3; 12 Debug(a); 13 return 0; 14}
HELPER(DEBUG)は、DEBUGが未定義なら DEBUGSTAT、定義されていたら STATへ展開されます。(名前が変です。方針をミスって意図したのの逆になってしまいました。)
gccとclangの最新版では期待通り動作しましたが、この方法は処理系に依存するかもしれません。#define DEBUG
でDEBUGが1と定義される処理系もあったような気がしますので。(その時はそれを考慮して適宜定義を変えれば対応は出来るはずですが。)
この辺りには私にはとても使えない超絶テクニックが存在します。
CPP(コンパイルしない方の関数型なC言語)プログラミング入門。とりあえずFizzBuzzまで
↑のCPPはC言語プリプロセッサの頭文字ですね。
投稿2019/07/08 03:38
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
せいぜい、これくらいでしょうか。
C
1#include <stdio.h> 2int DEBUG=0; 3 4#define DEBUG 1 5 6#define Debug(a) do{if(DEBUG){printf("%d",a);}}while(0) 7int main() { 8 int a = 3; 9 Debug(a); 10 return 0; 11}
int DEBUG=0;
と書くのを止めて、デバッグかどうかを#define DEBUG 0
と#define DEBUG 1
で切り替えると、0
の時は最適化でその部分のコードが生成されないので、そっちの方が良いかと思います。
投稿2019/07/07 16:29
編集2019/07/07 16:41総合スコア84557
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/07 15:27
2019/07/07 15:29
2019/07/07 15:31
2019/07/07 15:33
2019/07/07 15:36