Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [C++] Сможет ли залинковаться сишный файл не содержащий ни одной функции  (Прочитано 8095 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
katerina
Гость
« : 17-12-2009 20:01 » 

помогите пожалуйта!!!
сможет ли залинковаться сишный файл  не содержащий ни одной функции, но в котором объявлена глобальная переменная или же он будет исключен по причине, что в нем нет ни одной функции?
НаПример есть файл
1.с
Код:
/*со следующим содержанием глобальной переменной*/
int i;
и есть хидер, в котором определение i
1.h
Код:
/*со следующим содержанием*/
extern int i;
и еще куча файликов в которых используется  переменная i
и файлик майн

Код:
main.c
#include"1.h"

void main()
{
i=1;
}
« Последнее редактирование: 17-12-2009 20:09 от RXL » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 17-12-2009 20:11 » 

Для начала вспомним, что линкуются не исходные файлы, а объектные модули. Модуль содержит материальные объекты (код, данные) и информацию об импортируемых и экспортируемых символах (именах).
Соответственно, если в исходном модуле нет ни одного материального объекта, то объектный файл будет пустым и линковать уже будет нечего, хотя ошибки это не вызовет.

В приведенном тобой примере, в файле 1.c есть материальный объект - глобальная переменная.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 17-12-2009 20:12 » 

Правила компиляции. Компилируются все .c и .cpp файлы, которые подключены к проекту. Все они компилируются в объектные файлы. Потом уже линковшик собирает все объектные файлы в один исполняемый файл.
В твоем случае в файле 1.c нужно включить инклуд 1.h. А в Хедере 1.h нужно поставить стражей. Иначе при множественном включении у тебя произойдет ошибка линковки.
Т.е. будет выглядеть так.
1.c
Код:
#include "1.h"
int i;

1.h
Код:
#ifndef _1_H
#define _1_H

extern int i;

#endif // _1_H
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 17-12-2009 20:14 » 

Finch, необязательно включать 1.h в 1.c в данном примере, т.к. символ "i" и так не является локальным. Или я что-то не учел?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 17-12-2009 20:25 » 

Да. Сейчас проверил. Не обязательно включать. Но в такой ситуации я все равно включаю. Человек очень забывчивое сушество. Через некоторое время, при разборе будет намного легче вспоминать. Что и с чем связано.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 18-12-2009 04:02 » 

Код:
#ifndef _1_H
#define _1_H

extern int i;

#endif // _1_H

можно сделать проще (если эта прагма поддерживается конкретным компилятором)

1.h
Код:
#pragma once

extern int i;

Записан

katerina
Гость
« Ответ #6 : 20-12-2009 17:52 » 

СпасибО за помощь))),
А есть ли какие-то еще возможности пользоваться глобальной переменной в нескольких сишных файликах?
« Последнее редактирование: 20-12-2009 19:37 от Sel » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 20-12-2009 17:56 » new

Можно сделать переменную открытым статическим членом какого-нибудь класса. Эффект будет такой же Улыбаюсь
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines