我有三个文件。 test.c
test.h
和use.c
。每个代码看起来像:
test.h:
#pragma once
#define unused __attribute__((unused))
typedef int cmd_fun_t(struct tokens *tokens);
typedef struct fun_desc {
cmd_fun_t *fun;
char *cmd;
char *doc;
} fun_desc_t;
int cmd_exit(struct tokens *tokens);
int cmd_help(struct tokens *tokens);
int cmd_pwd(struct tokens *tokens);
int cmd_cd(struct tokens *tokens);
test.c的:
#include <ctype.h>
#include <errno.h>
#include <stdbool.h>
#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/wait.h>
#include <termios.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/signal.h>
#include "test.h"
#include "tokenizer.h"
fun_desc_t cmd_table[] = {
{cmd_help, "?", "show this help menu"},
{cmd_exit, "exit", "exit the command shell"},
{cmd_pwd, "pwd", "print working directory"},
{cmd_cd, "cd", "change directory"},
};
int cmd_pwd(unused struct tokens *tokens){
char cwd[8192];
if (getcwd(cwd, sizeof(cwd)) != NULL)
fprintf(stdout, "%s\n", cwd);
else
perror("Error Occured");
return 1;
}
int cmd_cd(unused struct tokens *tokens){
if(chdir(tokens_get_token(tokens, 1)) == -1){
fprintf(stdout, "No such file or directory.\n");
return -1;
}
return 1;
}
/* Prints a helpful description for the given command */
int cmd_help(unused struct tokens *tokens) {
for (unsigned int i = 0; i < sizeof(cmd_table) / sizeof(fun_desc_t); i++)
printf("%s - %s\n", cmd_table[i].cmd, cmd_table[i].doc);
return 1;
}
/* Exits this shell */
int cmd_exit(unused struct tokens *tokens) {
exit(0);
}
use.c:
#include "test.h"
int main(){
for(int i = 0; i < sizeof(cmd_table); i++){
}
return 0;
}
我的假设是这应该可以正常工作,但是当我编译代码时,它会出现以下错误:
'cmd_table'未声明(在此函数中首次使用)for(int i = 0; 我&lt;的sizeof(cmd_table);我++)
为什么会发生这种情况的任何建议?
答案 0 :(得分:4)
cmd_table
在test.c
中定义。如果您希望编译器在编译其他C文件时可以看到它,则在编译其他文件时需要显示extern
声明。通常的方法是将extern
声明放在标题中。
// in test.h
extern fun_desc_t cmd_table[];
不幸的是,这不会告诉你阵列有多大。对于像这样的查找表,解决此问题的常用方法是在结尾处放置一个null的sentinel值。
fun_desc_t cmd_table[] = {
{cmd_help, "?", "show this help menu"},
{cmd_exit, "exit", "exit the command shell"},
{cmd_pwd, "pwd", "print working directory"},
{cmd_cd, "cd", "change directory"},
{NULL, NULL, NULL}
};
您可以更改main
中的循环,如下所示
int main()
{
for(int i = 0; cmd_table[i].fun != NULL; i++)
{
// Do whatever
}
return 0;
}
答案 1 :(得分:1)
cmd_table在test.c文件中声明,您在use.c文件中使用它。由于cmd_table的范围仅限于test.c文件,因此无法在use.c文件中使用它