Dalam aplikasi konsol anda, anda telah mengalami ralat yang tidak dijangka semasa menyusun fail A.cpp dan B.cpp . Kedua-dua fail mengandungi kod berikut:
#include "stdafx.h" int k;
Walau bagaimanapun, proses penyusunan menghasilkan ralat:
Error 1 error LNK2005: "int k" (?a@@3HA) already defined in A.obj
Ralat ini berpunca daripada pelanggaran "peraturan satu definisi." Dalam C , setiap pembolehubah, fungsi dan objek hanya boleh ditakrifkan sekali. Dalam kes anda, anda telah menentukan pembolehubah "k" dalam kedua-dua A.cpp dan B.cpp.
Jika anda mahu untuk menggunakan pembolehubah bernama yang sama dalam kedua-dua fail, anda boleh menggunakan ruang nama tanpa nama (ruang nama tanpa nama) untuk mengelakkan konflik.
namespace { int k; }
Dengan merangkum "k" dalam ruang nama, anda mengehadkan skopnya dengan berkesan kepada fail masing-masing, menghalang ralat definisi.
Jika anda berhasrat untuk berkongsi pembolehubah "k" merentas berbilang fail, anda boleh menggunakan teknik pengisytiharan dan definisi luaran:
A.h (fail pengepala)
extern int k;
A.cpp
#include "A.h" int k = 0;
B.cpp
#include "A.h" // Use 'k' variable as needed
Dalam senario ini, anda mengisytiharkan pembolehubah sebagai luaran dalam A.h dan mentakrifkannya dalam A.cpp. Fail B.cpp hanya perlu memasukkan A.h untuk mengakses pembolehubah, mengelakkan konflik definisi.
Atas ialah kandungan terperinci Mengapakah saya mendapat ralat \'ralat LNK2005: sudah ditakrifkan?\' apabila saya mentakrifkan pembolehubah yang sama dalam berbilang fail C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!