#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)
...
Сказав все это, я бы настоятельно посоветовал вам передавать значения в качестве параметров, а не использовать глобальное состояние. Глобальное состояние — это зло. Избегайте этого, как чумы.