You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:40:23