数组实现栈时extern变量初始化报错问题求助
数组实现栈时
extern变量初始化冲突的解决方法 问题重现
尝试用C语言实现数组版栈,编写的代码及编译报错如下:
push操作代码(0-push_arr_stack.c)
#include "stack.h" /** * push_arr_stack - pushes an element to the stack * @n: The number that will be pushed to the stack * * Return: It returns nothing * */ void push_arr_stack(int n) { top = top + 1; stack_arr[top] = n; }
头文件(stack.h)
#ifndef STACK_H #define STACK_H #define MAX 4 extern int stack_arr[MAX]; extern int top = -1; void push_arr_stack(int n); #endif
测试主函数(main.c)
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include "stack.h" /** * main - Entry point for my program * * Return: On success, it returns 0, * On error, it returns -1 */ int main(void) { push_arr_stack(7); return (0); }
编译错误信息
gcc -Wall -Werror -Wextra -pedantic -std=gnu89 main.c 0-push_arr_stack.c In file included from main.c:4: stack.h:6:12: error: ‘top’ initialized and declared ‘extern’ [-Werror] 6 | extern int top = -1; | ^~~ cc1: all warnings being treated as errors In file included from 0-push_arr_stack.c:1: stack.h:6:12: error: ‘top’ initialized and declared ‘extern’ [-Werror] 6 | extern int top = -1; | ^~~ cc1: all warnings being treated as errors
错误原因
C语言中,extern的作用是声明变量(告知编译器该变量在其他文件中定义),而非定义变量。如果给extern变量添加初始化值,会强制将其转为变量定义(等同于去掉extern的普通变量定义)。当多个源文件包含该头文件时,会导致top被多次定义,同时违反extern的使用规则,触发编译报错。
修正方案
需将变量的声明与定义彻底分离:
1. 修改头文件stack.h
仅保留extern声明,移除初始化操作:
#ifndef STACK_H #define STACK_H #define MAX 4 // 仅声明变量,告知编译器变量在其他文件中定义 extern int stack_arr[MAX]; extern int top; void push_arr_stack(int n); #endif
2. 在单个源文件中定义并初始化变量
选择一个源文件(比如0-push_arr_stack.c)完成变量的唯一定义与初始化:
#include "stack.h" // 全局变量的定义与初始化,确保仅在该文件中出现一次 int stack_arr[MAX]; int top = -1; /** * push_arr_stack - pushes an element to the stack * @n: The number that will be pushed to the stack * * Return: It returns nothing * */ void push_arr_stack(int n) { top = top + 1; stack_arr[top] = n; }
3. 额外优化:添加栈满检查
为避免数组越界,push操作应先判断栈是否已满:
void push_arr_stack(int n) { if (top >= MAX - 1) { printf("Stack overflow!\n"); return; } top = top + 1; stack_arr[top] = n; }
修改完成后重新编译即可正常运行,top变量会被正确初始化为-1以跟踪栈顶索引。
内容的提问来源于stack exchange,提问作者Leuel Asfaw
相关产品推荐
相关产品推荐

