как определить переменную в одном файле и использовать ее в другом

#c #linker #header-files #runtime-error #extern

#c #компоновщик #заголовочные файлы #время выполнения-ошибка #внешний

Вопрос:

Вопрос может быть очень простым, но я все равно не понимаю…

У меня есть два файла… и я упоминаю, что я хочу сделать.

файл 1

 ...
j = data->alloc_len;
...
  

файл 2

 ...
  for(i=0;i<j;i  )
...
  

Это ясно из вышеизложенного, я хочу присвоить значение переменной в одном файле и хочу использовать это значение в другом файле.

Я пробовал #include "file1.c" в file2.c, но он выдает много ошибок повторного объявления.

Я попытался создать отдельный заголовочный файл, в котором есть только одна строка int j , а затем включил его в оба файла, используя, extern но снова безрезультатно.Хотя я думаю, что заголовочные файлы предназначены для того, чтобы я мог создавать и присваивать значение переменной в одном файле, а затем это значение можно распространять на все другие файлы, включая этот.

Может быть, я ошибаюсь, но мне это нужно в ближайшее время, поэтому, пожалуйста, помогите мне…Спасибо заранее.

Ограничение —

Значение может быть присвоено только через file1.c , потому data что структура объявлена и определена только здесь.Я не могу указать значение variable j в заголовочном файле.

Редактировать :

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

Для целей отладки я попробовал это..

sample.h

  extern int j;
  

file1.c

  #include "sample.h"
 int j=245;
  

file2.c

   #include "sample.h"
  printf("%d",j);
  

но это ошибка получения.

Ошибка, которую я получаю, это :

     Couldn't open module sample.so, tried:
sample.so: cannot open shared object file: No such file or directory
./sample.so.so: cannot open shared object file: No such file or directory
/usr/local/lib/sendip/sample.so.so: 
    cannot open shared object file: No such file or     
    directory
/usr/local/lib/sendip/sample.so: undefined symbol: j
  

* на самом деле ни один файл не содержит функцию main *

На самом деле это очень большой проект, который я использую Makefile , и все файлы будут связаны во время выполнения.

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

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

Ответ №1:

Вы могли бы поместить это в заголовочный файл:

 extern int j;
  

и объявляйте «real» только j в file1.c. Если file2.c содержит этот заголовок, то он может использовать variable j .

Но, используйте описательные имена переменных как минимум для глобальных. И вам следует избегать глобальных значений, насколько это возможно, они являются обузой в долгосрочной перспективе, IMO.

(Вы могли бы рассмотреть что-то вроде создания функции, file1.c которая возвращает это значение. Преимущество этого заключается в том, что j оно контролируется file1.c и читается только в других местах, ограничивая сложность понимания того, кто «владеет» этой переменной.)

Комментарии:

1. Можете ли вы показать какой-нибудь код, используя функцию .. может быть, это сработает

2. int getJ() { return j; } в file1.c, int getJ(); в file1.h. Только что видел ваше редактирование — вы должны убедиться, что оба ваших C-файла связаны с библиотекой.

3. int getJ(); в file1.h выдает ошибку samp.h:1:1: error: function declaration isn’t a prototype

4. скомпилировано, но снова та же ошибка undefined symbol getJ . Я так сильно запутался, что мне делать, пожалуйста, предложите мне или скажите мне какой-нибудь другой способ.

5. Вы неправильно связываете свой общий объект. Не могу сказать, что вы делаете неправильно, не видя ваши команды компиляции / ссылки.

Ответ №2:

вот так

в файле c вы определяете переменную, скажем, file1.c вы пишете

 int j;

...

j = data->alloc_len;
  

заголовок для вашего file1.h будет содержать

 extern int j;
  

этот заголовок вы включаете в file2.c

 #include "file1.h"
  

но я бы предложил использовать более описательное имя переменной.

Ответ №3:

#include "file1.c" почти никогда не является правильным решением проблемы. Неизменно вы хотите объявлять вещи в заголовочных файлах, а затем определять их только в одном исходном файле.

file1.h

 extern int j;
  

file1.c

 #include "file1.h"
j = data->alloc_len
  

file2.c

 #include "file1.h"
if (j>0)
    ...
  

Сказав все это, я бы настоятельно посоветовал вам передавать значения в качестве параметров, а не использовать глобальное состояние. Глобальное состояние — это зло. Избегайте этого, как чумы.