2

我是 C 编程新手。当我将 blank.h 文件包含到 Test.c 文件中时,程序将无法编译,但是当我将 blank.c 文件包含到 Test.c 文件中时,它可以正常编译。以下是所有 .c 和 .h 文件的来源。我使用 gcc 作为我的编译器,我觉得我需要与它进行某种链接?任何帮助都会非常感谢!

这是 Test.c 源

#include <stdio.h>
#include "blank.h"
#include "boolean.h"

int main()  
{
    bool result = blank("");

    printf("%d\n", result);

    return 0;
}

这是空白.h 源

// Header file for blank function

bool blank(char string[]);

这是空白.c 源

#include "boolean.h"
#include "blank.h"
#include <regex.h>

bool blank(char string[])
{

    regex_t regex_blank;
    int blank = regcomp(&regex_blank, "[:blank:]", 0);

    blank = regexec(&regex_blank, string, 0, NULL, 0);

    if  ( string == NULL || blank == 1 )
        return true;
    else
        return false;
}

最后是 boolean.h

// Boolean

// Define true
#ifndef true
#define true 1
#endif

// Define false
#ifndef false
#define false 0
#endif

typedef int bool;
4

5 回答 5

2

我想你是手动运行 GCC 否则你不会有这个问题。

您可以手动为每个 .c 文件运行 GCC,也可以一起为它们运行它。

gcc *.c

如果您稍后执行,则不应遇到链接器错误。

于 2012-09-30T23:30:40.667 回答
2

好的,所以我尝试了您提供的源代码。有几个问题。这是我如何构建的确切步骤,我修复了什么。看看这是否适合你:

在一个文件夹中创建了 4 个文件:Test.c、blank.c、blank.h 和 boolean.h 将代码复制过来。

从外壳运行:

 gcc Test.c blank.c -o b

输出:

In file included from Test.c:2:0:
blank.h:3:1: error: unknown type name ‘bool’
blank.c: In function ‘blank’:
blank.c:11:46: error: ‘NULL’ undeclared (first use in this function)
blank.c:11:46: note: each undeclared identifier is reported only once for each function it appears in

修复第一个错误:在 blank.h 中添加了这个:#include "boolean.h"

修复第二个错误:在空白.c 中,在其他包括后添加:#include <stdlib.h>

终端再次运行:

 gcc Test.c blank.c -o b

然后从终端运行 ./b 并打印 1。

于 2012-10-01T00:14:37.053 回答
0

你忘了包括警卫:

空白.h:

#ifndef BLANK_H_INCLUDED
#define BLANK_H_INCLUDED

bool blank(char string[]);

#endif

这些包含保护可防止每次源文件包含头文件时重新定义头文件的内容。确保也为 boolean.h 执行此操作。

于 2012-09-30T23:29:43.197 回答
0

您需要包含boolean.hblank.h,

// Header file for blank function

#include "boolean.h"
bool blank(char string[]);

或者你需要blank.h在 in之前包含它Test.c,否则编译器不bool知道blank.

除此之外,始终使用包含守卫的建议是好的,应该遵循。

于 2012-09-30T23:38:53.210 回答
0

从 Test.c 中删除 #include "blank.h" 并运行 gcc Test.c blank.c 后,它编译得很好。感谢您对包含警卫的建议,以及做 gcc Text.c blank.c

于 2012-10-01T00:25:41.813 回答