C++ UDPクライアントプログラムをコンパイルしようとすると、奇妙なコンパイラエラーが発生します。
g ++ -o client Udp.cpp ClientMain.c -I。 -lpthread
ClientMain.c:1:0からインクルードされたファイル:
Udp.h:デストラクタ「CUdpMsg :: 〜CUdpMsg()」内:
Udp.h:103:43:エラー:「無料」はこのスコープで宣言されていません
Udp.h:メンバー関数「void CUdpMsg :: Add(in_addr_t、const void *、size_t)」:
Udp.h:109:34:エラー:「malloc」はこのスコープで宣言されていません
Udp.h:109:41:エラー:「memcpy」はこのスコープで宣言されていません
ClientMain.c:関数「intmain(int、char **)」内:
ClientMain.c:28:57:エラー:「memcpy」はこのスコープで宣言されていません
ClientMain.c:29:61:エラー:「printf」はこのスコープで宣言されていません
ClientMain.c:30:17:エラー:「stdout」はこのスコープで宣言されていません
ClientMain.c:30:23:エラー:「fflush」はこのスコープで宣言されていません
ClientMain.c:34:68:エラー:「printf」はこのスコープで宣言されていません
ClientMain.c:35:17:エラー:「stdout」はこのスコープで宣言されていません
ClientMain.c:35:23:エラー:「フラッシュ」はこのスコープで宣言されていません
ClientMain.c:37:30:エラー:「usleep」はこのスコープで宣言されていません
Cppファイルの先頭で次のように宣言しています。
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <ifaddrs.h>
#include <net/if.h>
#include <cstdlib>
#include <string>
#include <stdlib.h>
#include <cstring>
#include <errno.h>
'memcpy'のような関数はstring.hで宣言する必要があります...私はそれ(およびstringとcstring)をすべて宣言しましたが、それでもこれらのコンパイラエラーが発生します。なぜこれが起こっているのか誰かが手がかりを持っていますか?ありがとう。
複数のファイルがある場合は、各ファイルに適切なインクルードが必要です。また、名前空間内にないのでしょうか?
マークBは、エラーの正確な原因をすべてカバーしています。 1つのcppファイル(_#include <cHEADER>
_ vs _#include <HEADER.h>
_)でCヘッダーの2つのフレーバーを混在させないようにする必要があることを追加したいだけです。
_#include <cHEADER>
_バラエティは、含まれているすべての宣言をstd ::名前空間に取り込みます。 _#include <HEADER.h>
_ファイルには宣言が含まれていますが含まれていません。 std::malloc()
が必要なときにコードを維持するのは面倒ですが::strncpy()
。ファイルごとに1つのアプローチを選択するか、プロジェクト全体に対して1つのアプローチを選択してください。
別の問題として、ヘッダー自体に必要なものがすべて含まれていないという状況が発生しました。バグはインクルードの順序に応じて表示または非表示になる可能性があるため、デバッグが面倒な場合があります。
ヘッダーとcppのペアを作成する場合は、常に一致するヘッダーをcppファイルの最初のインクルードにしてください。これにより、ヘッダーが完全であり、独立することが保証されます。実装を必要としないスタンドアロンヘッダーを作成する場合でも、空の.cppを作成してヘッダーの包含の完全性をテストするか、コンパイラーを介してヘッダーを単独で実行することができます。作成するすべてのヘッダーでこれを行うと、現在のような頭痛を防ぐことができます。
Udp.h
ファイルまたはには、必要なシステムヘッダーを含める必要があります。さらに、インクルードとしてcstring
とcstdlib
を使用するため、すべてのCライブラリ関数をstd::
で修飾する必要がありますではありませんこれらのヘッダーによってグローバル名前空間に自動的にインポートされます。
よりクリーンな解決策は、おそらくCUdpMsg::~CUdpMsg
の実装をudp.h
からudp.cpp
に移動することであり、同様に、そのようなエラーを発生させる関数も同様です。関数が本当に単純な場合(ゲッターなど)にのみ、ヘッダーで関数を定義します。