[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
質問
3つのプロジェクトがあります。 サーバー , クライアント と コモンズ . のヘッダーとソースのペアを作成します。 コモンズ の両方から自由にアクセスすることができます。 サーバー と クライアント .
しかし、何らかの理由で、追加のソース/ヘッダーファイルを
サーバー
または
クライアント
プロジェクトは常に
multiple definition of (...)
と
first defined here
のエラーが発生します。
例
commands.h (のルートディレクトリにあります)。 クライアント プロジェクト)
#ifndef COMMANDS_H_
#define COMMANDS_H_
#include "commands.c"
void f123();
#endif /* COMMANDS_H_ */
コマンド.c (のルートディレクトリにあります)。 クライアント プロジェクト)
void f123(){
}
main.c (のルートディレクトリにあります)。 クライアント プロジェクト)
#include "commands.h"
int main(int argc, char** argv){
}
エラーです。
make: *** [Client] Error 1 Client
first defined here Client
multiple definition of `f123' commands.c
クリーニング、インデックスの再構築、プロジェクトの再構築を行っても解決しない。コンピュータを再起動してもダメです。
解決方法は?
ここで問題なのは、あなたが
commands.c
で
commands.h
を関数プロトタイプの前に置く。そのため、C言語のプリプロセッサは
commands.c
を
commands.h
を関数プロトタイプの前に置く。
commands.c
には関数定義が含まれています。 その結果、関数定義が関数宣言より前に来てしまい、エラーが発生します。
の内容は
commands.h
プリプロセッサーフェーズの後では、次のようになります。
#ifndef COMMANDS_H_
#define COMMANDS_H_
// function definition
void f123(){
}
// function declaration
void f123();
#endif /* COMMANDS_H_ */
C言語では、関数を定義した後で宣言することはできないので、これはエラーになります。
#include "commands.c"
というのも、関数プロトタイプが関数宣言の前に来るようになったからです。
しかし
.c
ファイルは
バッドプラクティス
であり、避けるべきである。この問題に対するより良い解決策は
commands.h
で
commands.c
で、コンパイルされたバージョンのコマンドをメインファイルにリンクします。例えば
commands.h
#ifndef COMMANDS_H_
#define COMMANDS_H_
void f123(); // function declaration
#endif
コマンド.c
#include "commands.h"
void f123(){} // function definition
関連
-
[解決済み】stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み] テスト
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み] Eclipseにプロジェクトをインポートした後に「Must Override a Superclass Method」エラーが発生する。
-
[解決済み] "ダウンストリーム "と "アップストリーム "の定義
-
[解決済み】定義と宣言の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】組み込み関数「malloc」の暗黙の宣言の非互換性
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み] '{'トークンの前に期待される式
-
[解決済み】execvp: バッドアドレスエラー
-
[解決済み】配列型char[]が代入できない [重複]。
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?