2015-01-26 8 views
1

Я хочу включить переменную, объявленную во внешний файл в C.Объявление переменной в заголовке C

Моя структура проекта выглядит так.

foo.h 
foo.c 
variable.c 
main.c 

Что я делаю прямо сейчас

/* main.c */

#include "foo.h" 

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


int main() { 
    bar(); 
    printf("%d\n", a); 
    return 0; 
} 

/* foo.h */

#ifndef FOO_H 
#define FOO_H 

#include "variable.c" 

extern const int a; 
extern const int b[]; 


int bar(); 
#endif 

/* Foo .c */

#include "foo.h" 
#include <stdio.h> 

int bar() { 
    printf("tururu\n"); 
    printf("%d\n", b[0]); 
    return 0; 
} 

/* variable.c */

const int a = 2; 
const int b[3] = {1, 2, 3}; 

Переменные, которые я хочу, чтобы определить, таким образом, являются постоянными (только для чтения).

Я не знаю заранее размер массива, это зависит от определения в переменной.c.

Так что мой вопрос:

  • Является ли это правильный способ включить некоторые постоянные переменные из внешнего источника?

  • Если это так, что я делаю неправильно и как можно исправить?

Спасибо

EDIT: Я обновил свой код с примером, который может быть проверен. Этот код не компилируется, потому что он говорит, что «b» не объявлен в функциональной строке. Если я комментирую printf в баре, он компилируется и запускается. Итак, переменные можно увидеть по основным, а не по foo.c?

EDIT2: Переменные, включенные таким образом, доступны только для чтения. Я обновил код и добавил include foo.h в foo.c, и теперь компилятор говорит, что существует несколько определений «a» и «b»

EDIT3: очистите код и вопрос, пытающийся быть более ясными.

+2

Возможный дубликат [Как использовать extern для обмена переменными между исходными файлами в C?] (Http://stackoverflow.com/questions/1433204/how-do-i-use-extern-to-share-variables -between-source-files-in-c) – Chostakovitch

+0

Я прочитал, что перед тем, как написать свой вопрос, но он не ответил мне. Моя проблема в том, что я не могу определить и инициализировать мою переменную в foo.c Мне нужно это во внешнем файле и в этом вопросе эта проблема не наблюдается. Но спасибо за ссылку, это очень полезный ответ. – deckard

+0

Я также обновил вопрос, чтобы прояснить различия. – deckard

ответ

2

Удалите #include "variable.c" от foo.h, и ваш код должен работать.

Вы в основном используете extern, чтобы сообщить своему компилятору, что все, что вы используете в объявлении после ключевого слова extern, будет определено в другом исходном файле .c, который связан отдельно. В вашем случае этот .c файл - variable.c.

И да, позаботьтесь о том, чтобы никогда не #include .c файлы. Это может легко привести к тому, что компоновщик будет работать с haywire.

+2

variable.c также должен включать foo.h, поэтому компилятор может улавливать несоответствия типов. – mafso

+0

Готово и работает! Я включил foo.h в переменную.c также. – deckard

+0

@mafso: да, я не заметил, что OP изначально не делал этого =) – Mints97

1

Это хорошая практика, чтобы объявить переменную в файле заголовка и определяют в файл Си

более

деталь: Variable Definition vs Declaration

В вашем variable.h, вы просто определить две переменной

Таким образом, это не так.

Кроме того, код связан с массивом не так, вы можете поместить его в .c файл

+0

Если переменная не является постоянной (только для чтения), это очень плохая практика, чтобы объявить ее в файле заголовка. Не используйте глобальные переменные. – Lundin

+0

Переменные доступны только для чтения. – deckard

2

Переменные должны быть определены в переменном файле, в то время как в заголовке вы можете поставить внешняя ссылка

/* foo.h */ 
#ifndef FOO_H 
#define FOO_H 

#include "variable.h" 

extern int a; 
extern int b[]; 

#endif 

/* foo.c */ 

int a = 2; 
int b[3] = {1, 2, 3}; 
+0

Дело в том, что я не могу определить переменные в foo.c Мне нужно сделать это из внешнего файла. – deckard

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