Pointer to incomplete class type "struct File\_" is not allowedC/C++(393)

I forgot to mention that the only files in this project are:

Makefile
mem\_filesystem.c
ssfs.c
memfs

Contents of ssf.c:

/\*\*
 \* Simple & Stupid Filesystem.
 \* 
 \* Mohammed Q. Hussain - http://www.maastaar.net
 \*
 \* This is an example of using FUSE to build a simple filesystem. It is a part of a tutorial in MQH Blog with the title "Writing a Simple Filesystem Using FUSE in C": http://www.maastaar.net/fuse/linux/filesystem/c/2016/05/21/writing-a-simple-filesystem-using-fuse/
 \*
 \* License: GNU GPL
 \*/
 
#define FUSE\_USE\_VERSION 30

#include 
#include 
#include 
#include 
#include 
#include 
#include 

extern int statit(const char \*name,int \*psize);
extern int init();
static int do\_getattr( const char \*path, struct stat \*st )
{
 //printf( "[getattr] Called\n" );
 //printf( "\tAttributes of %s requested\n", path );
 
 // GNU's definitions of the attributes (http://www.gnu.org/software/libc/manual/html\_node/Attribute-Meanings.html):
 // st\_uid: The user ID of the file’s owner.
 // st\_gid: The group ID of the file.
 // st\_atime: This is the last access time for the file.
 // st\_mtime: This is the time of the last modification to the contents of the file.
 // st\_mode: Specifies the mode of the file. This includes file type information (see Testing File Type) and the file permission bits (see Permission Bits).
 // st\_nlink: The number of hard links to the file. This count keeps track of how many directories have entries for this file. If the count is ever decremented to zero, then the file itself is discarded as soon 
 // as no process still holds it open. Symbolic links are not counted in the total.
 // st\_size: This specifies the size of a regular file in bytes. For files that are really devices this field isn’t usually meaningful. For symbolic links this specifies the length of the file name the link refers to.
 
 st->st\_uid = getuid(); // The owner of the file/directory is the user who mounted the filesystem
 st->st\_gid = getgid(); // The group of the file/directory is the same as the group of the user who mounted the filesystem
 st->st\_atime = time( NULL ); // The last "a"ccess of the file/directory is right now
 st->st\_mtime = time( NULL ); // The last "m"odification of the file/directory is right now
 
 
 if ( strcmp( path, "/" ) == 0 )
 {
 st->st\_mode = S\_IFDIR | 0755;
 st->st\_nlink = 2; // Why "two" hardlinks instead of "one"? The answer is here: http://unix.stackexchange.com/a/101536
 }
 else
 {
 int size=0;
 int type = statit(path,&size);
 printf("after statit %s %d %d\n",path,size,type);
 if (type ==1)
 {
 st->st\_mode = S\_IFREG | 0644;
 st->st\_nlink = 1;
 st->st\_size = size;
 }
 else
 if (type ==2){
 st->st\_mode = S\_IFDIR | 0755;
 st->st\_nlink = 2; 
 }
 }
 
 return 0;
}

extern int do\_readdir( const char \*path, void \*buffer, fuse\_fill\_dir\_t filler, off\_t offset, struct fuse\_file\_info \*fi );
/\*static int do\_readdir( const char \*path, void \*buffer, fuse\_fill\_dir\_t filler, off\_t offset, struct fuse\_file\_info \*fi )
{
 printf( "--> Getting The List of Files of %s\n", path );
 
 filler( buffer, ".", NULL, 0 ); // Current Directory
 filler( buffer, "..", NULL, 0 ); // Parent Directory
 
 if ( strcmp( path, "/" ) == 0 ) // If the user is trying to show the files/directories of the root directory show the following
 {
 filler( buffer, "file54", NULL, 0 );
 filler( buffer, "file349", NULL, 0 );
 }
 
 return 0;
}\*/
extern int do\_read( const char \*path, char \*buffer, size\_t size, off\_t offset, struct fuse\_file\_info \*fi);
/\*static int do\_read( const char \*path, char \*buffer, size\_t size, off\_t offset, struct fuse\_file\_info \*fi )
{
 printf( "--> Trying to read %s, %u, %u\n", path, offset, size );
 
 char file54Text[] = "Hello World From File54!";
 char file349Text[] = "Hello World From File349!";
 char \*selectedText = NULL;
 
 // ... //
 
 if ( strcmp( path, "/file54" ) == 0 )
 selectedText = file54Text;
 else if ( strcmp( path, "/file349" ) == 0 )
 selectedText = file349Text;
 else
 return -1;
 
 // ... //
 
 memcpy( buffer, selectedText + offset, size );
 
 return strlen( selectedText ) - offset;
}
\*/
static struct fuse\_operations operations = {
 .getattr = do\_getattr,
 .readdir = do\_readdir,
 .read = do\_read,
};

int main( int argc, char \*argv[] )
{
 init();
 return fuse\_main( argc, argv, &operations, NULL );
}
불완전한 클래스 유형 "구조체 File\_"에 대한 포인터는 허용되지 않습니다C/C++(393)이 프로젝트의 유일한 파일은 다음과 같다는 것을 언급하는 것을 잊었습니다:메이크 파일mem\_filesystem.cssfs.cmemfsssf.c의 내용/\*\* \* 단순하고 멍청한 파일 시스템. \*  \* 모하메드 Q. 후세인 - http://www.maastaar.net \* \* 이 예제는 FUSE를 사용하여 간단한 파일시스템을 구축하는 예제입니다. "C에서 FUSE를 사용하여 간단한 파일 시스템 작성"이라는 제목의 MQH 블로그 튜토리얼의 일부입니다: http://www.maastaar.net/fuse/linux/filesystem/c/2016/05/21/writing-a-simple-filesystem-using-fuse/ \* \* 라이센스: GNU GPL \*/ #define FUSE\_USE\_VERSION 30#포함 #포함 #include #include #include #include #include 외부 int statit(const char \*name,int \*psize);외부 int init();static int do\_getattr( const char \*path, struct stat \*st ){ //printf( "[getattr] Called\n" ); //printf( "\t요청된 %s의 속성\n", 경로 );  // GNU의 어트리뷰트 정의(http://www.gnu.org/software/libc/manual/html\_node/Attribute-Meanings.html): // st\_uid: 파일 소유자의 사용자 ID. // st\_gid: 파일의 그룹 ID. // st\_atime: 파일의 마지막 액세스 시간입니다. // st\_mtime: 파일 내용을 마지막으로 수정한 시간입니다. // st\_mode: 파일의 모드를 지정합니다. 여기에는 파일 형식 정보(파일 형식 테스트 참조) 및 파일 권한 비트(권한 비트 참조)가 포함됩니다. // st\_nlink: 파일에 대한 하드 링크 수입니다. 이 카운트는 이 파일에 대한 항목이 있는 디렉터리 수를 추적합니다. 카운트가 0으로 감소하면 파일 자체는 즉시 삭제됩니다.  // 아직 열려 있는 프로세스가 없기 때문입니다. 심볼릭 링크는 총계에 포함되지 않습니다. // st\_size: 일반 파일의 크기를 바이트 단위로 지정합니다. 실제 장치인 파일의 경우 이 필드는 일반적으로 의미가 없습니다. 심볼릭 링크의 경우 링크가 참조하는 파일 이름의 길이를 지정합니다.  st->st\_uid = getuid(); // 파일/디렉토리의 소유자는 파일시스템을 마운트한 사용자입니다. st->st\_gid = getgid(); // 파일/디렉토리의 그룹은 파일시스템을 마운트한 사용자의 그룹과 동일합니다. st->st\_atime = time( NULL ); // 파일/디렉토리의 마지막 액세스는 지금입니다. st->st\_mtime = time( NULL ); // 파일/디렉토리의 마지막 접근시간은 지금입니다.   if ( strcmp( path, "/" ) == 0 ) { st->st\_mode = S\_IFDIR | 0755; st->st\_nlink = 2; // 왜 "하나"가 아닌 "두" 하드링크일까요? 답은 여기에 있습니다: http://unix.stackexchange.com/a/101536 } else { int size=0; int type = statit(경로,&크기); printf("statit %s %d %d\n",경로,크기,유형); if (type ==1) { st->st\_mode = S\_IFREG | 0644; st->st\_nlink = 1; st->st\_size = size; } else if (type ==2){ st->st\_mode = S\_IFDIR | 0755; st->st\_nlink = 2;  } }  return 0;}외부 int do\_readdir( const char \*path, void \*buffer, fuse\_fill\_dir\_t filler, off\_t offset, struct fuse\_file\_info \*fi );/\*정적 int do\_readdir( const char \*path, void \*buffer, fuse\_fill\_dir\_t filler, off\_t offset, struct fuse\_file\_info \*fi ){ printf( "--> %s\n의 파일 목록 가져오기", 경로 );  filler( buffer, ".", NULL, 0 ); // 현재 디렉토리 filler( buffer, "..", NULL, 0 ); // 상위 디렉토리  if ( strcmp( path, "/" ) == 0 ) // 사용자가 루트 디렉터리의 파일/디렉터리를 표시하려는 경우 다음과 같이 표시합니다. { 필러( 버퍼, "file54", NULL, 0 ); filler( buffer, "file349", NULL, 0 ); }  반환값은 0입니다;}\*/외부 int do\_read( const char \*path, char \*buffer, size\_t 크기, off\_t 오프셋, 구조체 fuse\_file\_info \*fi);/\*static int do\_read( const char \*path, char \*buffer, size\_t size, off\_t offset, struct fuse\_file\_info \*fi ){ printf( "--> %s, %u, %u\n을 읽으려는 중", 경로, 오프셋, 크기 );  char file54Text[] = "Hello World From File54!"; char file349Text[] = "Hello World From File349!" char \*selectedText = NULL;  // ... //  if ( strcmp( path, "/file54" ) == 0 ) selectedText = file54Text; else if ( strcmp( path, "/file349" ) == 0 ) selectedText = file349Text; else 반환 -1;  // ... //  memcpy( 버퍼, 선택된 텍스트 + 오프셋, 크기 );  반환 strlen( selectedText ) - 오프셋;}\*/정적 구조체 fuse\_operations operations = { .getattr = do\_getattr, .readdir = do\_readdir, .read = do\_read,};int main( int argc, char \*argv[] ){ init(); return fuse\_main( argc, argv, &operations, NULL );}