質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

2612閲覧

c言語:マクロを利用した#ifdef #endifの簡単化

kotue_245

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2019/07/07 15:06

前提・実現したいこと

プログラム先頭に #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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kotue_245

2019/07/07 15:27

ありがとうございます。 ifdefを用いずにマクロ定義でする方法を考えているので考えていることと少し違います。すいません。
Zuishin

2019/07/07 15:29

DEBUG が定義されているかどうかを知る方法が他に無いので無理だと思います。
kotue_245

2019/07/07 15:31

ありがとうございます。 マクロの定義内で#ifdefを使うことは可能でしょうか?
Zuishin

2019/07/07 15:33

不可能です。
kotue_245

2019/07/07 15:36

ありがとうごさいます。
guest

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
mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kotue_245

2019/07/07 15:22

回答道理に変換してみました。 #include<stdio.h> #define DEBUG #define Debug(a,n) do{if(n==){printf("%d",a);}else{}}while(0) int main() { int a = 3; Debug(a, DEBUG); return 0; } 同じエラーが出るのですが… なぜでしょうか
mather

2019/07/07 15:31

同じエラーがでますよね。 n== なんて中途半端な状態が構文エラーとなるからです。 エラーメッセージにあるとおりですね。 ちなみに全てマクロを展開するとどうなるか書いてみましょう。
kotue_245

2019/07/07 15:34

ありがとうございます。 do{ if(DEBUG==){ printf("%d",a); } else{} }while(0) でしょうか
mather

2019/07/07 15:34

回答に追記しました。
Zuishin

2019/07/11 17:11

解決の手がかりが何も無いのに高評価されているので、打ち消すために低評価します。
guest

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

catsforepaw

総合スコア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}

wandbox

HELPER(DEBUG)は、DEBUGが未定義なら DEBUGSTAT、定義されていたら STATへ展開されます。(名前が変です。方針をミスって意図したのの逆になってしまいました。)
gccとclangの最新版では期待通り動作しましたが、この方法は処理系に依存するかもしれません。#define DEBUGでDEBUGが1と定義される処理系もあったような気がしますので。(その時はそれを考慮して適宜定義を変えれば対応は出来るはずですが。)

この辺りには私にはとても使えない超絶テクニックが存在します。
CPP(コンパイルしない方の関数型なC言語)プログラミング入門。とりあえずFizzBuzzまで
↑のCPPはC言語プリプロセッサの頭文字ですね。

投稿2019/07/08 03:38

Chironian

総合スコア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
otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/07/07 16:37

> そっちの方が良いかと思います。 あー、でも、そうするとプログラム途中で切り替えたい場合に、 #undef DEBUG #define DEBUG 0 と2行ずつ書かないといけないですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問