C语言 如何定义一个数组取决于操作系统?



我的问题是,根据操作系统,我需要声明一个包含错误文本的数组,但我不知道如何使用头文件和预处理器指令实现这一点。

我已经尝试了以下实现,但我无法访问所需的数组:

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

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

c:

#include "stdio.h"
#include "s21_errorno.h"
int main() {
for (int i = 0; i < 50 ; ++i) {
printf("%s",os_error[i]);
}
return 0;
}

让我们从头文件开始。你需要一个声明这里:extern const char *os_error[];。这允许您在包含它的每个.c文件中使用不完整的char指针数组。

在。c文件中,你需要一个定义:const char *os_error[] = { /*stuff*/ };

但是你的os_error是一个不完整的数组,所以你不能用sizeof得到它的大小。定义一个size_error变量来报告数组的大小可能会很有用。

s21_errorno.h:

#ifndef S21_ERRORNO_H
#define S21_ERRORNO_H
#include <stdlib.h>
extern const char *os_error[];
extern size_t size_error;
#endif  // S21_ERRORNO_H

s21_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" };
size_t size_error = sizeof os_error / sizeof *os_error;
#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" };
size_t size_error = sizeof os_error / sizeof *os_error;
#endif

c:

#include <stdio.h>
#include "s21_errorno.h"
int main(void)
{
for (size_t i = 0; i < size_error; ++i) {
printf("os_error[%d] = %sn", i, os_error[i]);
}
return 0;
}

您可以在errno.c文件中这样定义变量以消除重复:

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

errno.h中对应的标头定义为:

#ifndef ERRORNO_H
#define ERRORNO_H
extern const char *os_error[];
extern size_t size_error;
#endif

最新更新