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

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

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

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

Q&A

0回答

1114閲覧

C言語のプリプロセッサの置き換え

ttact

総合スコア170

C

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

0グッド

3クリップ

投稿2020/12/28 01:11

環境

gcc 2.7.2
Visual Studio Professional 2015

前提

gcc2.7.2でコンパイルする組み込み環境向けのコードを、Windowsに移植する作業を行っています。

このプロジェクトは、今後はgcc2.7.2とMSVCの両方でビルド・動作するようにメンテナンスする必要があります。

このプロジェクトは既存コードが大量にあり、一から書き直すのは(そうしたいのは山々ですが)現実的ではありません。

ターゲット環境はとても古く、やや特殊です。上記のgccのバージョンは間違いではなくて、これでもサポートしているコンパイラの中では最新版です。ターゲット環境向けに提供されているライブラリ等の事情もあり、自前でgccをソースからコンパイルする等でバージョンアップする等も不可です。

課題

既存のコードに

C

1#warning "message"

で書かれたコンパイル時メッセージが大量にあります。用途としては(別に警告を出したいのではなく)MSVCで言う#pragma messageをやりたかっただけです。

これをそのままにするとMSVCで大量にエラーが出るので、MSVCでは#pragma messageに置き換えるのですが、gccではこれまで通り#warningとして扱いたいと思います。

既存の#warning利用箇所を書き換えること自体はOKなのですが、

  • MSVCでは#pragma message
  • gccでは#warning

といった感じに展開されるようにするために、どう書き換えたら良いのかが全く思いつきません。仮に可能なのであれば、プリプロセッサの領域だと思うのですが、#defineに対して#は書けないと思いますし...。

今のところは、全ての#warning利用箇所について、

C

1#if defined(_MSC_VER) 2# pragma message("message") 3#elif defined(__GNUC__) 4# warning "message" 5#endif

という感じで書き換える方向で進んでいますが、さすがにこのコードはどうかと思っています。

何かいいアイディアをお持ちの方がいらっしゃいましたら、ご教授頂ければと思います。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/12/28 02:46

Pragma演算子がサポートされているなら対応できるかもしれませんが、2.7.2だとちょっと無理そうですね
Daregada

2020/12/28 03:08

あとは、「PRAGMA_MESSAGE」とか「PRAGMA_WARNING」みたいなマクロを作ってそれを使うとかね。
ttact

2020/12/28 04:01

皆様コメントありがとうございます。まさにDaregadaさんが書かれたような「PRAGMA_MESSAGE」を実装する手段が知りたいのです。Pragma演算子が使えないので、別の手段でなんとかならないかなーと思っている次第です。
yumetodo

2020/12/28 08:06

そもそも論としてそんなにプリプロセス時警告出す必要ってあるんですかね・・・?
pepperleaf

2020/12/30 01:28

最近のは知らなけど、昔のUnix関係のコードは、そんな #if ばっかりだった記憶。 実際のコンパイル対象は何? てのが悩みのタネだった。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問