2013-10-05 6 views
0

Я знаю, что в программировании важно держать вещи простыми и иметь возможность быть изменены. Поэтому для меня это означает, что важно использовать разные файлы и функции и держать их отдельно, чтобы легче изолировать ошибки и улучшить читаемость.Вызов узла из другого файла

Я новичок в C, и я не понимаю, как это сделать. У меня есть nodeTest.h

#include <stdio.h> 
#include <stdlib.h> 

struct nodeTest 
{ 
    int data; 
    struct nodeTest* next; 

}; 

Затем я другой файл пытаюсь вызвать эту структуру

#include <stdio.h> 
#include <stdlib.h> 
#include "nodeTest.h" 

nodeTest* first = (nodeTest*)malloc(sizeof(nodeTest)); 

Я получаю ошибку о том, что NodeTest не декларируется (не в функции). Что это значит и почему я не могу использовать include для включения структуры или typedef?

+0

«NodeTest * первый ...» находится внутри функции права? C не позволяет выполнять исполняемые команды, кроме внутренней функции. –

+1

Поместите свой код в функцию с именем «main», например. –

+0

Почему никто не видит, что его проблема - это код вне функции? –

ответ

3

Вы должны использовать struct NodeTest вместо NodeTest.

Это потому, что С различает три пространства имен:

  • пространство имен. Структур
  • Пространство имен псевдонимов типов (имена типов).
  • Пространство имен и союзов.

Таким образом, везде, где вы хотите использовать структуру, вы должны указать компилятор, имя которого ссылается на структуру. Например:

int main() 
{ 
    struct NodeTest node; 
} 

Один из способов этой проблемы заключается в определении псевдонима для этой структуры, чтобы «добавить» в-структуру с типами имен:

typedef NodeTest NodeTestType; 

int main() 
{ 
    NodeTestType node; //OK 
} 

Или с использованием общих идиом, объявить непосредственно структура как псевдоним:

typedef struct { ... } NodeTest; 

Обратите внимание, что это предложение делает это сделать алиас NodeTest неназванного структуры у вас есть разл lared в той же инструкции.
Одна из проблем этого подхода заключается в том, что вы не можете использовать тип внутри структуры, потому что он еще не объявлен. Вы можете обойти его именования-структуру:

typedef struct nodeTest //<-- Note that the struct is not anonimous 
{ 
    int data; 
    struct nodeTest* next; 
} nodeTest; 
+0

Та же ошибка re независимо от того, существует ли структура или нет. –

+0

@ ripDaddy69 показать нам больше кода (код, в котором вы используете структуру, например). Контекст может помочь нам решить вашу проблему. В контексте Whitout мы понятия не имеем о вашей ошибке. – Manu343726

+0

Мой код точно такой же, как и я, но я изменил его на структуру typedef, как вы сказали. –

2

В глобальном масштабе, можно просто объявить/определить функции, структуру или глобальные переменные. Вы не можете вызвать функцию точно так же (буквально «из ниоткуда»). Создать main и вызвать malloc изнутри:

int main(void) { 
    nodeTest* first = (nodeTest*) malloc(sizeof(nodeTest)); 
    free(first); 
    return 0; 
} 

struct nodeTest { 
    int data; 
    struct nodeTest* next; 
}; 

определяет struct nodeTest так

nodeTest* first; 

неизвестен компилятор.Чтобы решить эту проблему можно либо использовать:

struct nodeTest* first; 

или даже лучше: использовать typedef при определении вашего struct и все будет в порядке:

typedef struct nodeTest { 
    int data; 
    struct nodeTest* next; 
} nodeTest ; 
+0

Я получаю ту же ошибку, независимо от того, есть ли у меня struct nodeTest или нет. –

+0

@ ripDaddy69: попробуйте изменить определение на 'typedef' (это должно решить все неприятные вхождения идентификатора' nodeTest'). – LihO

+0

О, странно, почему я не смог использовать там структуру? –

1

вам нужно определить NodeTest Типу

typedef struct nodeTest_t 
{ 
    int data; 
    struct nodeTest_t* next; 

}nodeTest; 

или еще
в main(), используйте ключевое слово struct перед nodeTest.

+0

Я все еще получаю ту же ошибку. –

+0

копировать выше определения в свой первый файл. а затем попробуйте. – Gangadhar

+0

Он по-прежнему не работает, проблема заключается в nodeTest * first = (nodeTest *) malloc (sizeof (nodeTest)); line -] –

1

Просто поместите код внутри функции, как это:

#include <stdio.h> 
#include <stdlib.h> 
#include "nodeTest.h" 

int main(void) { 
    struct nodeTest* first = malloc(sizeof(struct nodeTest)); 
    return 0; 
} 
+0

Я не хочу, чтобы все еще было достаточно, но я предполагаю, что я пытаюсь использовать это в другой функции, которая будет вызываться в основном. –

+0

Я все еще получаю сообщение об ошибке, которое вначале не существует, когда я вызываю его в том же файле. –

Смежные вопросы