読み取り専用の.hファイルの一部(10行目から15行目など)を.Cファイルに使用する必要があります。
注: .h ファイルは私のモジュールのものではないため、編集できません。また、すべての .h ファイル変数を使用することはできません。
このような使い方はありますか?
インクルード クライアント コードとして、インクルード ヘッダーのどの行が使用されるかを任意に制御することはできません。
#if
#ifdef
一部のヘッダーでは、 orを使用して明示的に制御を許可#ifndef
するため、そのヘッダーを含める前にプリプロセッサの定義を設定し、使用する行に影響を与えることができます。
それ以外の場合は、自分でアクセスする必要がある変数を宣言することもできますが、それは強くお勧めしません。ヘッダーが進化するにつれて、宣言がヘッダーとは異なるものになってしまう可能性があります。C++ では特に問題があり、ヘッダー ファイルの作成者は、クライアントがクリーンに再コンパイルする能力を損なうことなく変更class X
を行うことを合理的に期待する可能性がありますが、独自のコードで " " を宣言した場合、これはテンプレートであることと競合します。template <...> class XT ...; typedef XT<...> X;
class X;
コメントで、ニーズのより具体的な詳細を説明しました。
異なるモジュール (.h ファイル) からいくつかの変数のみを使用する必要があります。すべての .h ファイルに #include を使用すると、「'Tabc_st' の冗長な再宣言、'Ta[b]c_st' の以前の宣言がここにありました」という警告が表示されます..... – laki
ある種の「ハンガリー語」表記が使用されていると推測し、吐き気から回復した後、T
type および. もしそうなら、あなたは複数の宣言またはs を持っています。他の回答にリストされているオプションについてコメントするには:_st
struct
struct Tabc_st
typedef ... Tabc_st;
#include
別々の名前空間の競合するヘッダー: これは問題に対する適度にクリーンで構造化されたアプローチですが、裏目に出る可能性があります: たとえば、ヘッダーがライブラリをリンクする予定の機能を公開している場合、マングルされた名前は一致せず、リンクします失敗します。
#define
問題のあるヘッダーの 1 つを除くすべての周りの Tabc_st WhateverElse: これは typedef には最適ですがstruct Tabc_st
、ヘッダーの後半で型を使用すると、代わりに "WhateverElse" が表示されることを意味します。 Tabc_st を取得し、任意のヘッダーの任意のコードで使用すると、すべてが異なるタイプを期待しているため、これがうまくいかないことがわかります。
もう 1 つの方法は、問題のある .h をそれぞれラップする .h/.cpp ペアを提供し、競合しない新しい名前を使用してその機能を公開することです。それを維持するにはかなりの労力が必要です。
実行可能なハックは、次のようなコンパイル前の手順をスクリプト化することです。
TABC_ST=`fgrep 'struct Tabc_st;' header1.h`
fgrep -v --line-regexp $TABC_ST header2.h > header2_sans_tabc.h
fgrep -v --line-regexp $TABC_ST header3.h > header3_sans_tabc.h
次に、..._sans_tabc.h
ヘッダーを使用します....
できるよ
#define Tabc_st bogus_thing_I_can_ignore
#include <readonlyheaderfile.h>
#undef Tabc_st
ヘッダー ファイルは、Tabc_st を再宣言する代わりに、bogus_thing_I_can_ignore を宣言します。Tabc_st が typedef 名であり、ヘッダーがその型を使用している場合、typedef は単なるエイリアスであり、新しい型ではないため、これは引き続き機能します。
ヘッダーファイルを編集できない場合、コードの一部のみを使用する方法はありません。変数名の競合を解決するには、別の名前空間を使用することを強くお勧めします。また、メモリを節約するためにコードの一部のみを含めようとしている場合は、そうしないでください。無駄な変数が少ないことは大したことではありません。