LINUX.ORG.RU

Как правильно импортировать переменную?

 , ,


0

1

Привет всем. Итак дано: в файле foo.c определен тип ttype и переменная var этого типа. Нужно импортировать её в файл bar.c, чтобы использовать там. Это возможно выполнить корректно средствами C?

Всем спасибо.

Нет ли возможности вынести этот тип в header? :) Переменную через extern, для этого в bar.c:

extern ttype var;
И при линковке оно найдет ее.

Можно поступить так: просто объявить копию этого типа под другим именем ttype2. И написать extern ttype2 var. Я предполагаю, оно не будет проверять. Так как ttype == ttype2 то ничего не упадет.

I-Love-Microsoft ★★★★★
()

в файле foo.c определен тип ttype

Либо определить такой же ttype в bar.c, либо, что предпочтительнее, вынести тип в заголовочный файл, подключив его и к foo.c, и в bar.c.
Затем в bar.c:

extern ttype var;

bormant ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

просто объявить копию этого типа под другим именем ttype2

Зачем под другим именем?
Единица трансляции другая. Или думаете включение заголовков в разные единицы трансляции работает как-то иначе?

foo.h

typedef int some_t;

foo.c
#include "foo.h"
some_t var;

bar.c
#include "foo.h"
extern some_t var;

После препроцессора компилятор видит:
foo.c

typedef int some_t;
some_t var;
bar.c
typedef int some_t;
extern some_t var;

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 2)
Ответ на: комментарий от LongLiveUbuntu

То есть только патчить

Кого и зачем патчить?

Ясно

Это вряд ли.

bormant ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

extern не срабатывает так ибо тип не найден

опишите такой же тип, если нет возможности сделать общий заголовок:
foo.c

typedef int some_t;
some_t var;

bar.c
typedef int some_t;
extern some_t var;

Вот только за синхронностью объявлений some_t придется отдельно следить, в отличие от варианта с заголовком.

bormant ★★★★★
()
Ответ на: комментарий от alexanius

Но ведь оно лежит сторонним файлом, полагаю откуда-то из реп. Вряд ли патчить это то, чего желает ТС.

А что если объявить typedef с одним и тем же именем. Общего хедера нет, вряд ли будет кукарекать про multiple definition.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Но ведь оно лежит сторонним файлом, полагаю откуда-то из реп. Вряд ли патчить это то, чего желает ТС.

Так там ни кода, ни описания ситуации. Я так понял что в любом случае патчить исходник придётся.

alexanius ★★
()
Ответ на: комментарий от I-Love-Microsoft

Это потому, что все бросились делать то что сказал тС, вместо логичного вопроса зачем.

Может он компилял что-то и оно зафелилось с сообщением типа

warning: #warning Type xxx sharing disabled due flag DISABLE_SHARED_XXX [-Wcpp]
#warning Type xxx sharing disabled due flag DISABLE_SHARED_XXX
  ^~~~~~~
error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘data’
 xxx[] data;

Он побежал на ЛОР, а потом включил мозг.

anonymous
()
Ответ на: комментарий от I-Love-Microsoft

Там вышло, что эти объявления по сути для внутреннего использования функциями API, насколько я понял. Так что лазить в них не требуется.

В принципе черкану еще автору кода на мыло с вопросами, ответ напишу.

LongLiveUbuntu ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.