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

如何根据操作系统定义不同的错误信息数组?

跨操作系统错误文本数组的定义与访问修复

问题背景

需要根据操作系统(Linux/macOS)定义包含错误描述文本的数组,但现有代码无法正常访问目标数组,原实现代码如下:

原errorno.c

#include "s21_errorno.h"

#ifdef __linux__
os_error[] = {"",
               "Operation not permitted",
               "No such file or directory",
               "No such process",
               "Interrupted system call",
               "I/O error",
               "No such device or address",
               "Argument list too long",
               "Exec format error",
               "Bad file number",
               "No child processes"};

#elif __APPLE__
os_error[] = {"",
              "Operation not permitted",
              "No such file or directory",
              "No such process",
              "Interrupted system call",
              "Input/output error",
              "Device not configured",
              "Argument list too long",
              "Exec format error",
              "Bad file descriptor",
              "No child processes"};

#endif

原s21_errorno.h

#ifndef C2_S21_STRINGPLUS_0_S21_ERRORNO_H
#define C2_S21_STRINGPLUS_0_S21_ERRORNO_H

#define const char* os_error[]

#endif  // C2_S21_STRINGPLUS_0_S21_ERRORNO_H

原main.c

#include "stdio.h"
#include "s21_errorno.h"

int main() {

 for (int i = 0; i < 50 ; ++i) {
    printf("%s",os_error[i]);
  }
  return 0;
}

错误分析

  1. 头文件声明错误:使用#define const char* os_error[]会将所有os_error文本替换为const char* [],导致语法混乱,无法正确声明数组的外部可见性。
  2. 数组定义缺少类型:errorno.c中定义数组时未指定const char*类型,不符合C语言语法规范。
  3. 越界访问风险:main.c中循环访问到i=50,但数组实际仅包含11个元素,会触发未定义行为。

修正后的代码实现

修正后的s21_errorno.h

#ifndef C2_S21_STRINGPLUS_0_S21_ERRORNO_H
#define C2_S21_STRINGPLUS_0_S21_ERRORNO_H

// 声明外部数组,让其他编译单元可访问
extern const char* os_error[];

// 定义数组长度宏,避免越界访问
#ifdef __linux__
#define OS_ERROR_COUNT 11
#elif __APPLE__
#define OS_ERROR_COUNT 11
#endif

#endif  // C2_S21_STRINGPLUS_0_S21_ERRORNO_H

修正后的errorno.c

#include "s21_errorno.h"

#ifdef __linux__
const char* os_error[] = {
    "",
    "Operation not permitted",
    "No such file or directory",
    "No such process",
    "Interrupted system call",
    "I/O error",
    "No such device or address",
    "Argument list too long",
    "Exec format error",
    "Bad file number",
    "No child processes"
};

#elif __APPLE__
const char* os_error[] = {
    "",
    "Operation not permitted",
    "No such file or directory",
    "No such process",
    "Interrupted system call",
    "Input/output error",
    "Device not configured",
    "Argument list too long",
    "Exec format error",
    "Bad file descriptor",
    "No child processes"
};

#endif

修正后的main.c

#include "stdio.h"
#include "s21_errorno.h"

int main() {
    // 使用宏控制循环范围,确保不越界
    for (int i = 0; i < OS_ERROR_COUNT; ++i) {
        printf("%d: %s\n", i, os_error[i]);
    }
    return 0;
}

编译与运行

编译时需将所有相关文件一起编译,例如:

gcc main.c errorno.c -o error_demo
./error_demo

内容的提问来源于stack exchange,提问作者Flex1sh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:35:22