2

呼び出し元の関数が同じファイルにない場合でも、charポインターを返すことはできますか?たとえば、関数を呼び出すと、次のようになります。

 void gotest(sqlite3 *pt,char *nutzers)
{
    char string[1064];
    char *text;
    text = get_data_byName(pt,"whatever",string);   
    printf("test %s \n\n\n same file",text);    
}

 char *get_data_byName(sqlite3 *ptr,char *user,char *resulter)
{
    .......
    resulter = "TestCall";
    return resulter;
}

gotest(sqlite3 *pt,char *nutzers)char *get_data_byName(sqlite3 *ptr,char *user,char *resulter)が異なるファイルにある場合、gccは次のようになります

代入は、キャストなしで整数からポインタを作成します

1つのファイルに両方の関数がある場合、すべてが正常に機能します。

次のようにコンパイルします。

gcc -o test test.c time.c database.c libircclient-1.6/src/libircclient.o -lsqlite3 
4

5 に答える 5

2

関数が異なるファイルにあるためではなく、エラーが発生します。異なるコンパイル単位の関数が相互に呼び出すことはまったく問題ありません。本当の問題は、プロトタイプを提供せずに他のファイルから関数を呼び出そうとしていることです。これが発生すると、Cはリターンタイプを。と見なしintます。

次の内容のヘッダーファイルを作成します。

get_data_byName.h

char *get_data_byName(sqlite3 *ptr,char *user,char *resulter);

次に、このヘッダーファイルを両方のCファイルにインクルードします。

#include "get_data_byName.h"

コンパイルの警告は消えます。

于 2012-08-20T13:47:22.550 に答える
2

get_data_byName()にvisibleの宣言があってはならないgotest()ので、コンパイラは暗黙の宣言を生成し、戻り型のを割り当てintます。したがって、警告が表示されます。get_data_byName()解決するには、たとえばヘッダーファイルにの宣言を追加し、それがに表示されることを確認しgotest()ます。

get_data.h

#ifndef GET_DATA_HEADER_H_
#define GET_DATA_HEADER_H_

extern char* get_data_byName(sqlite3 *ptr,char *user,char *resulter);

#endif

次に#include <get_data.h>、が定義されている.cファイルで。gotest()

于 2012-08-20T13:48:03.747 に答える
2

はい、それは確かに可能です。関数を呼び出す前に、関数を宣言する必要があります。

char * get_data_byName(sqlite3 *ptr, char *user, char *resulter);

また、該当する場合は、実際constにポインタを使用する必要があります。

また、リテラル以外の文字列を返す必要がある場合は、メモリ管理について考える必要があることを忘れないでください。

于 2012-08-20T13:48:13.610 に答える
2

ファイルにはヘッダーが必要です。GCCが、使用されているファイルに関数プロトタイプを見つけられない場合、GCCは関数が。を返すと想定しますint。ヘッダーを読む必要があります。それまでの間、これを使用するファイルに入れるget_data_byNameだけで十分です。

char *get_data_byName(sqlite3 *ptr,char *user,char *resulter);

GCCがリンクしているときは、あなたが定義していることを知っていますがget_data_byName、コンパイルしているときは、どのパラメーターと戻り値を持っているかを知る必要があることを覚えておく必要があります。それがヘッダーの目的です。ヘッダーには関数プロトタイプが含まれています。関数プロトタイプは次のようになります。

char *get_data_byName(sqlite3 *ptr,char *user,char *resulter);

.c1つのファイルで定義されたすべての関数のプロトタイプを1つの.hファイルに入れ、それら#includeをその関数を使用するファイルのヘッダーに入れると、そのエラーは発生しなくなります。したがって、というファイルがある場合get_data_by_name.c、これは次のようになりますget_data_by_name.h

#ifndef GET_DATA_BY_NAME_H
#define GET_DATA_BY_NAME_H
char *get_data_byName(sqlite3 *ptr,char *user,char *resulter);
#endif

次に、以下#includeを使用するファイルでそれだけを使用しますget_data_byName

#include "get_data_by_name.h"
于 2012-08-20T13:49:03.783 に答える
2

それらを「別々のファイルに」どのように持っているかによります。K&Rで指定された形式では、使用している.cファイルごとに2つの追加の.hファイルが必要になります。.hファイルは関数プロトタイプを宣言します。そこから、file_2.hをfile_1.cに含め、get_data_byNameをgotestで使用できるようにすることができます。お役に立てば幸いです。

**file_1.c**
include "file_1.h"
include "file_2.h"

void gotest(sqlite3 *pt,char *nutzers)
{
    char string[1064];
    char *text;
    text = get_data_byName(pt,"whatever",string);   
    printf("test %s \n\n\n same file",text);    
}


**file_2.c**
char *get_data_byName(sqlite3 *ptr,char *user,char *resulter)
{
    .......
    resulter = "TestCall";
    return resulter;
} 

**file_1.h**
void gotest(sqlite3 *pt,char *nutzers);

**file_2.h**
char *get_data_byName(sqlite3 *ptr,char *user,char *resulter);
于 2012-08-20T13:54:45.157 に答える