13

リンク可能な静的ライブラリまたは共有ライブラリにコンパイルされた、ヘッダーとソースファイルで構成されたCまたはC++ライブラリを使用するとします。

ライブラリのヘッダー(数十...または数百のファイル)には、いくつかのマクロ/シンボルが定義されています。

ここで、このライブラリをプロジェクトで使用したいと思います。このライブラリは、いくつかのマクロとシンボルも定義しています。もちろん、名前の衝突は避けたいと思います。これは、特にwindows.hで報告されることがあるためです。しかし、より一般的には、そのヘッダーから実際にエクスポートされるものを制御し続けたいと思います。

gccプリプロセッサオプションを使用して、定義されたシンボルのリストを作成できます。

gcc -E -dM include/great_lib.h | sort -V >symbols.txt

これにより、ファイルsymbols.txtに、このヘッダーが含まれている場合にユーザーファイルに含まれるすべての定義済みシンボルのソート済みリストが出力されます。

ただし、シンボルのみが表示され、定義されたファイルは表示されません

役に立つ情報になると思います。たとえば、一部のシステムマクロが「great_lib.h」またはそのアセンダントで再定義されているかどうかを確認します。残念ながら、gccプリプロセッサオプションをチェックした後、gccを使用してそれを行う方法がわかりません。

たとえば、私に与えるだけでなく、次のようになります。

#define M_PI 3.14159265358979323846

それは生成します

#define M_PI 3.14159265358979323846; /usr/include/math.h

たぶん-dNオプションで何か?しかし、その出力は私にとって混乱を招き、さらにテキスト処理が必要であり、情報がどのように階層化されているのか理解できません。またはもっと簡単な方法ですか?

関連する質問:

4

3 に答える 3

2

-dD オプションは、前処理されたソースとマクロを出力します。これには、現在のソース ファイルを示す行が含まれます。

# 1 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.2/../../../../include/_mingw.h" 1 3

(i) これらの行を解析して現在のソース ファイルを追跡する小さなプログラムを作成できます。#define(ii) (and etc)で始まり\t# define、その後に現在のソース ファイル名が続くすべての行を出力します。(iii) 他のすべての行 (ソース コード、宣言など) を破棄します。

于 2013-01-11T18:58:38.000 に答える
1

それを行う簡単なUNIXの方法:

find "$PATH_TO_LIB" -name "*.h" | xargs grep "^[ \t]*#[ \t]*define"

次に、sed と sort を使用して、フォーマットを少しきれいにすることができます。

また、gcc のマニュアルによると、gcc はこの種のことについて警告します。

http://gcc.gnu.org/onlinedocs/cpp/Undefining-and-Redefining-Macros.html

マクロが古い定義と事実上同じではない定義で再定義された場合、プリプロセッサは警告を発行し、新しい定義を使用するようにマクロを変更します。新しい定義が事実上同じである場合、再定義は黙って無視されます。これにより、たとえば、2 つの異なるヘッダーで共通のマクロを定義できます。プリプロセッサは、定義が一致しない場合にのみ文句を言います。

于 2013-01-11T14:48:10.243 に答える