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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

4回答

5713閲覧

マクロで定義された不使用部分や,未到達関数の削除を行ってくれるツール

ElecDove

総合スコア254

C

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2018/10/03 05:30

編集2022/01/12 10:55

C言語(C++)で#defineや#ifなどのマクロを使いますが,
既にあるソースコード(サンプルソース)から,コンパイラが無視する部分(#ifでfalseになる部分等)を削除したり,
その中でのみ呼ばれている関数を削除してくれるツールはありませんか?
ただし,ソース中のコメントは残してほしいです

コンパイラが吐き出す中間のソースが取り出せればよいのですが….

背景
※RXマイコンによる開発をしていますが,ルネサスのサンプルソースが,
ひとつのプロジェクトに様々な機能を詰めているため,解読が進んでいません
したがって,まずはひとつのプロジェクトに関する部分のみに絞ってみたいと考えています


開発環境は
CS+(無償評価版)
コンパイラは同梱の物を使っています

よろしくお願いします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

tiitoi

2018/10/03 05:40 編集

Visual Studio、Visual Studio Code などのエディタですと、無効になっているマクロに囲まれたコードブロックは、半透明になり、折りたためる機能がありますが、削除できないと駄目でしょうか?
cateye

2018/10/03 05:57 編集

>コンパイラが吐き出す中間のソースが取り出せればよいのですが…. CS+については無知なのですが、コンパイラに"-E"オプションないですかね? ただ、gccやclangの場合、有効なソースのみ取り出すのでコメント残らないですが・・
ElecDove

2018/10/04 07:21

VSCodeは私も使っており,確かに半透明になるのですが…様々なファイルに散らばったマクロや,(不要な)大量の関数のなかから必要なものだけを確認するのにとても労力がかかっておりこのような質問をした次第です.
ElecDove

2018/10/04 07:22

-Eオプションですね,コメントは最悪,あとからオリジナルソースで検索をかけてやってもいいかもしれません.調べてみます.
tiitoi

2018/10/04 08:02

-CC オプションというのを見つけました。これでコメントはキープされた状態になりました。1つ欠点としては、プリプロセッサ後なので、ヘッダーも展開されてしまうことです。どこまでが展開されたヘッダーかはわかると思うので、無視するか、スクリプトで機械的に除くといいかもしれません。
guest

回答4

0

VSCodeは私も使っており,確かに半透明になるのですが…様々なファイルに散らばったマクロや,(不要な)大量の関数のなかから必要なものだけを確認するのにとても労力がかかっておりこのような質問をした次第です.

コンパイラがプリプロセッサを行った直後の状態がみたいということですね。
gcc では -E オプションでプリプロセッサ後のファイルを標準出力に出力でき、-CC オプションでコメントを削除しないようにできるようです。

Options Controlling the Preprocessor

-CC

Do not discard comments, including during macro expansion. This is like -C, except that comments contained within macros are also passed through to the output file where the macro is expanded.

試した例

c

1#include "stdio.h" 2 3int main() 4{ 5#ifdef TEST 6 // TEST マクロが定義されている。 7 printf("TEST defined"); 8#else 9 // TEST マクロが定義されていない。 10 printf("TEST undifined"); 11#endif // TEST 12}

bash

1$ gcc main.cpp -E -CC | cat -s

c

1<...展開されたヘッダー> 2 3int main() 4{ 5 6 // TEST マクロが定義されていない。 7 printf("TEST undifined"); 8 9} 10

投稿2018/10/04 07:59

tiitoi

総合スコア21956

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

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

0

こんにちは。

マクロで定義された不使用部分や,未到達関数の削除

前者はありそうな気がしますが、後者はリンク処理まで行わないと分からないのでかなり厳しいと思います。

私は使ったことはないのですが、もしかすると clang-format に該当のオプションがある可能性はあります。
私は、これが使っている libTooling を使っています。libTooling はプリプロセス処理も同時に行い、プリプロセッサの動作もコールバックで通知してくるので、原理的には開発可能です。ですので希望はあると思います。(確定情報でなくて申し訳ないです。)
なお、「未到達関数の削除」はlibTooling単独では原理的に無理です。コンパイル単位ごとのAST解析までですから。(リンクはサポートしない)

投稿2018/10/03 07:38

Chironian

総合スコア23272

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

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

ElecDove

2018/10/04 07:17

回答ありがとうございます > clang-format このようなものがあるのですね.初めて知りました オプションの有無については調べてみたいと思います
guest

0

CS+ではなくHEWを使っています。
CS+の方が新しいでしょうから状況は異なるかもしれませんが、同じルネサスということでとりあえず回答しておきます。
他の回答にもあるようにコンパイルのオプションで出力するリストが選択できました。
例えばこんなコードをコンパイルすると、

c

1//#define DEBUG 2#define NUM 999 3 4void test(void) 5{ 6#ifdef DEBUG 7 printf("debug\n"); 8#endif 9 printf("%d\n", NUM); 10}

こんなのが出ます。

c

1SH SERIES C/C++ Compiler (V.9.04.01.002) 03-Oct-2018 15:01:08 PAGE 1 2 3************ SOURCE LISTING ************ 4 5FILE NAME: test.c 6 7 Seq File Line 0----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+- 8 1 test.c 1 //#define DEBUG 9 2 test.c 2 #define NUM 999 10 3 test.c 3 11 4 test.c 4 void test(void) 12 5 test.c 5 { 13 6 test.c 6 #ifdef DEBUG 14 7 test.c 7 X printf("debug\n"); 15 8 test.c 8 #endif 16 9 test.c 9 E printf("%d\n", 999); 17 10 test.c 10 }

7行目にXがついていてこの行は実行しないというのはわかりますが、お望みの行自体を削除することはできないようです。
またマクロも展開して出力されるので、9行目のNUMを999に置き換えられてしまい、コードを解読するという意味ではわかりづらいものになってしまいます。
やはりエディタで無効部分は色を薄くしたり折りたたむなどするほうが現実的かと思います。
上記はSHコンパイラの例ですので、RXコンパイラでどうなるかはわかりません。

もう少し見てみたら、プリプロセッサが展開したものを出力することができました。
こんなのになります。

c

1#line 1 "test.c" 2 3 4 5void test(void) 6{ 7 8 9 10 printf("%d\n", 999); 11}

お望みどおり実行されない行は削除されましたが、NUMは999に置き換えられてしまいますね。当然ですが。
これでよしとするかどうかはご判断ください。

投稿2018/10/03 06:07

編集2018/10/03 06:10
ttyp03

総合スコア16996

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

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

ElecDove

2018/10/04 07:19

回答ありがとうございます Defineの置き換えは実行されてしまうのですね とはいえ,目的の動作に一歩近づいたと思います わざわざ実験までしていただいて感謝いたします
guest

0

コンパイラのオプションでリストファイルを生成する、ってのがありますんで、それを使えば近いことができると思います、が、そのままコンパイラに掛けれるものができるかどうかはいろいろやって試してみてください

投稿2018/10/03 05:48

y_waiwai

総合スコア87719

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

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

ElecDove

2018/10/04 07:19

回答ありがとうございます 「リストファイルを出力」ですね 調べてみます. そのままかけられなくとも,まずは理解の助けになればと思います ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問