2

私はCプログラミングが初めてです。blank.h ファイルを Test.c ファイルにインクルードすると、プログラムはコンパイルされませんが、blank.c ファイルを Test.c ファイルにインクルードすると、正常にコンパイルされます。以下は、すべての .c および .h ファイルのソースです。コンパイラとして gcc を使用していますが、gcc と何らかのリンクを行う必要があると感じていますか? どんな助けでも大歓迎です!

これは Test.c のソースです

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

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

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

    return 0;
}

これは blank.h ソースです

// Header file for blank function

bool blank(char string[]);

これは blank.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"

2 番目のエラーを修正するには: blank.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

#include "blank.h" を Test.c から削除し、gcc Test.c blank.c を実行すると、正常にコンパイルされました。インクルード ガードに関するアドバイス、および gcc Text.c blank.c の実行に感謝します。

于 2012-10-01T00:25:41.813 に答える
0

boolean.hに含める必要がありますblank.h

// Header file for blank function

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

または、 の前に含める必要があります。そうblank.hTest.cないと、コンパイラはboolの宣言の型を認識しませんblank

それとは別に、常にインクルードガードを使用するというアドバイスは適切であり、従う必要があります。

于 2012-09-30T23:38:53.210 に答える