我的问题是,根据操作系统,我需要声明一个包含错误文本的数组,但我不知道如何使用头文件和预处理器指令实现这一点。
我已经尝试了以下实现,但我无法访问所需的数组:
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指针数组。
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