5

重複の可能性:
C++ でキーワード class を変数名として使用する

私が使用しているライブラリの C ヘッダー ファイルでは、変数の 1 つに「new」という名前が付けられています。残念ながら、私はこのライブラリを C++ プロジェクトで使用しており、変数名として 'new' が出現すると、コンパイラが異常終了します。私はすでに extern "C" { #include<...> } を使用していますが、この点では役に立たないようです。

「new」は C キーワードではないため、C 開発者としての観点からは、コードはまったく問題ありませんが、ライブラリ開発者にその変数の名前を変更するよう依頼する必要がありますか?

4

4 に答える 4

8

ヘッダーファイルをインクルードする前に、プリプロセッサを使用して名前を変更しnewます。

#define new mynew
#include <...>
#undef new

これにより、コンパイルを続行できます。

実際にこの変数にアクセスする必要がありますか?そうでない場合は、これで完了です。その場合は、ライブラリの.cファイルが次のコマンドでコンパイルされていることを確認する必要があります。

-Dnew=mynew
于 2010-06-02T07:09:56.510 に答える
3

ヘッダーにこの変数の名前が含まれている必要がありますか? 「new」という名前のグローバル変数を使用している場合、もちろん、グローバルに表示される変数名が必要になるのはそのためです。一方、これが「new」という名前の関数引数のようなものである場合は、関数の宣言から名前を削除するだけです。名前が構造体または共用体のメンバーである場合、ヘッダー ファイルで名前を変更しても、.C コードがそのソース コードと一致する名前の「プライベート」定義を認識している限り、.C コードに害はありません。

.C ファイルは C 構文でコンパイルする必要があるため、"new" という名前の変数を処理できるため、ヘッダー ファイルを修正することは有効な回避策です。

長期的には、はい、これをライブラリ開発者に知らせる必要があります。

最終的なややハックな解決策として、ヘッダー ファイルを「new」から「was_new」などに変更することができます。また、ライブラリの C ファイルをコンパイルするときは、コンパイラ スイッチを使用して#define new was_new.

于 2010-06-02T07:01:53.143 に答える
1

独自のラッパー関数を C で作成することもできます。使用するライブラリに関係するものはすべて、C++ に適したヘッダー ファイルを使用して C で作成されます。したがって、代わりに:

other_lib.h:
int foo( int new );

my_app.cxx:
extern "C" {
#include <other_lib.h>
}

コンパイルされない場合は、次のようにします。

my_wrap.h:
#ifdef __cplusplus
extern "C" {
#endif
int my_foo( int );
#ifdef __cplusplus
}
#endif

my_wrap.c:
#include <other_lib.h>
int my_foo( int x ) { return foo( x ); }

my_app.cxx:
#include "my_wrap.h"

...

my_wrap.c を C コンパイラでコンパイルしてから、my_app.cxx を C++ コンパイラでコンパイルします。これにより、既存のライブラリを変更せずにビルドできます。

于 2010-06-02T08:41:12.300 に答える
0

サード パーティ ライブラリの完全に優れたヘッダー ファイルを変更している場合は、今すぐ中止することをお勧めします。私が正しく理解していれば、CライブラリにC++コードを追加しようとしていますが、それはできません.CはC++キーワードであるため、「new」キーワードを認識しません。

代わりに、次のことをお勧めします。

ソース ファイル (*.cpp) を使用して別の C++ プロジェクトを作成し、そのサード パーティのヘッダー ファイルに #include を追加して、ライブラリのバイナリ ファイルをプロジェクトにリンクします (google "linking libs" など)。

それが少し役立つことを願っています、乾杯

于 2010-06-02T07:02:28.023 に答える