C语言中codes数组出现multiple definition错误的解决求助
解决“multiple definition of `codes'”链接错误
问题原因
你遇到的链接错误本质是变量重复定义:
- 头文件
funkcje.h中直接写了int codes[SIZE];,这是变量定义而非声明。 - 每个
.c源文件包含这个头文件时,都会独立生成一个codes数组的定义(头文件防护#pragma once或#ifndef只能防止单个源文件重复包含头文件,无法阻止多个源文件各自定义变量)。 - 你用的
#ifndef codes完全无效,因为codes是变量名,不是预处理器宏,预处理器不会识别这个条件,每个编译单元都会执行int codes[SIZE];的定义。
解决方案
要解决这个问题,必须遵循头文件声明变量,源文件定义变量的C语言规则:
1. 修改头文件funkcje.h
将原有的变量定义改为外部声明:
// funkcje.h #include <stdio.h> #include <math.h> #include <stdbool.h> #include <stdlib.h> #pragma once #define SIZE 1296 // 声明codes为外部变量,告诉编译器这个变量在其他源文件中定义 extern int codes[SIZE]; void populateCodeList(int codes[]); int getDigitBase10(int n, int digit); struct results checkCode(int trueCode,int guessCode); int getNextGuess(int codes[]); struct results{ int white; int red; };
2. 在单个源文件中定义codes数组
选择一个源文件(比如main.c),在文件开头添加变量定义:
// main.c #include "funkcje.h" // 在这里定义codes数组,整个程序只会有这一份定义 int codes[SIZE]; int main(void){ // ... 原有代码不变 }
原理说明
extern int codes[SIZE];是声明:它告诉编译器“这个变量存在,但是定义在其他地方”,不会分配内存。int codes[SIZE];是定义:它会分配内存,整个程序中只能有一次定义,链接器会将所有声明指向这个唯一的定义。
这样修改后,所有源文件通过头文件知道codes的存在,而只有main.c中包含它的实际定义,链接时就不会再出现重复定义的错误。
内容的提问来源于stack exchange,提问作者Meduza3
相关产品推荐
相关产品推荐

