2015-12-30 10 views
10

私が扱っているコードベースは歴史的にstdio.hへの依存を避けるために意図的に試みました。それは独自の印刷フォーマットとメカニズムを備えています。 printfの代わりに使われるはずのもの。stdio.h(または他の標準ヘッダ)のインクルードを防ぐ

しかし、誰かが頻繁に依存関係を追加して気づき、取り出さなければなりません。あなたがこれを行う場合には有用なメッセージがありますので、

#if !defined(NDEBUG) 
    void printf(float dont_link_with_stdio_h); 
#endif 

はgccの人々があまりにも簡単にエラーを停止するの線に沿って考えているように見える...かどうか:だから私は例最も簡単にアラームを作ってみましたあなたは<stdio.h>を含んでいますか?ビルトイン関数 'printfの'

ため

相反するタイプ(​​を)この警告をオフにする方法があります。そして、あなたがそこにいたくないことのためにシンボルダンプをフィルタするようなことを行う方法はすべてあります...

しかし、インクルードしたprintfの使い方を誰かに警告するstdio.h)インクルード方法がありますか? <stdio.h>の混入を防止するために

+0

コンパイルされたライブラリ(.lib)をコンパイル/リンクしないように削除できませんか? –

+0

@LeeTaylor私は、このライブラリを含む他のものに使用されるコンパイル環境を改ざんしないことを望んでいます(そして、望むならstdio.hを自由に組み込むことができます)。私は、私が試していた方法を使用し、 '-fno-builtin'を追加するよりも、あまり侵入しないものを探しています。ソースの中だけで行うことができるもの。 – HostileFork

+0

'grep printf * .c'? –

答えて

5

となるだろう。

#define printf do_not_include_stdio_h 
#include <stdio.h> 

int main(void) { 
    printf("Hello, world!\n"); 
    return 0; 
} 

produces the output:たとえば、あなたが心配している場合、それはさらにひどい名前であるか、または無効な記号を含める場合

undefined reference to `do_not_include_stdio_h'

マクロをのmungeすることができますいくつかの貧しい魂はdo_not_include_stdio_hを定義するでしょう。

ファイルを手動で編集する必要がないように、コンパイラフラグにマクロ定義を設定できます。例:

gcc -Dprintf=do_not_include_stdio_h my_file.c 
2

、私はあなたが、コンパイルやリンクエラーが発生しますいくつかの厄介な値になるようにprintfを再定義することができ

#if !defined(NDEBUG) 
#if defined(EOF) 
#error Do not include stdio.h, contact Joe for more information 
#endif 
#endif 
+1

いいね...この問題は、このインクルードが* stdio.hの後にあった場合にのみインクルードを止めるということであろうが。このヘッダーが以前にも含まれていた場合、私はそれを先取りしたいと思っています... – HostileFork

3

私はソースファイルにまったく触れません。私はビルドスクリプトを修正したい。メンテナンスが非常に簡単で、制限を回避できないように(コンパイル失敗の原因となるコードを変更するなど)簡単に行うことができます。メイクファイルで例えば

、あなたはまた、特定のターゲットにそれを行うことができ、すべて

all: 

    grep stdio *.h *.c 
    if ["$?" -eq 0 ]; then 
     echo "Do not use stdio. Contact Joe for info"; exit 2; 
    fi 

    <other stuff to do the build here> 

を構築all目標を持っていると仮定。たとえば、.oファイルを生成するために.cファイルをコンパイルするターゲットがある場合、コンパイルする前に.cファイルをチェックするだけです。

%.o : %.c 

     grep stdio $< 
     if ["$?" -eq 0 ]; then 
      echo "Do not use stdio. Contact Joe for info"; exit 2; 
     fi 

     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected] 

あなたの唯一の問題は、今あなたが(例えばbypass.joe#include <stdio.h>を持っている#include "bypass.joe"で)あなたの制限を回避するために決定された人がいる場合はどうするかです。そのためには、依存関係を生成するツール(例えばgcc -MMmakedependなど)を検索し、それを使ってソースファイルが依存するすべてのファイルを検索する方法を設定します。誰かがそれが決まっている場合は、メイクファイルの保護を設定して編集することもできます。

EDIT:ツールが依存ファイルを生成するように設定されている場合は、そのファイルをstdioとして検索してください。直接または間接的にコンパイル単位にstdio.hが含まれている場合、それは依存ファイルにリストされます。

+0

このようなgreppingの問題は、(別のプロセスによって生成されるので、私がむしろ避けるメイクファイルに侵入することを超えて) #ifdef'd out、該当しない場合はどうなるかなどの心配があります。独自のデバッグモードフラグを持つ.cのサードパーティ製ファイルがいくつかあります例外リストなどである必要があります。 – HostileFork

+0

メイクファイルに「侵略的」であり、プロジェクト内のすべてのコンパイルユニット(「ソースファイル」)で「侵略的」であるという選択肢がある場合は、最初に選択します。複雑なプロジェクトであっても、メイクファイルの数はコンパイルユニットの数をめったに上回りません。自動的に生成されたmakefile内で、makeを再帰的に使用してカスタム処理を確実にするテクニックがあります。 – Peter

+0

合理的で、オプションに感謝し、アップしました。しかし、私の特定のケースでは、バランスの良い選択はmakefileに触れないことです... – HostileFork

関連する問題