C文件无法查看包含文件中声明的变量

时间:2018-03-20 11:06:22

标签: c file compiler-errors compilation header

我有三个文件。 test.c test.huse.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);我++)

为什么会发生这种情况的任何建议?

2 个答案:

答案 0 :(得分:4)

cmd_tabletest.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文件中使用它