Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2014, 16:13   #1
zla9_kolu4ka
Форумчанин
 
Регистрация: 16.09.2013
Сообщений: 149
По умолчанию работа компилятора и линклвщика

main.c
Код:
#include "stdio.h"
#include "stdlib.h"
#include "tmp.h"

int a,b;
void main(void){
	a=5;b=10;
	sum(a,b);

	system("pause");
}
tmp.h
Код:
#ifndef TEMP_H  
#define TEMP_H

static int sum(int a,int b);

#endif
tmp.c
Код:
#include <stdio.h>

static int sum(int a,int b){
	printf("a+b=%d	\n",a+b);
	return a+b;
}
Ошибка в строке sum(a,b);
error C2129: статическая функция "int sum(int,int)" объявлена, но не определена
Прочитал в статье:
Компилятор допускает ссылки на функции если видел ранее объявления.
Объявление — это обещание, что определение существует где-то в другом месте программы.
Работа компоновщика проверить эти обещания.
Так какого компилятор бурагозит, а не линковщик??)

Последний раз редактировалось zla9_kolu4ka; 28.07.2014 в 16:38.
zla9_kolu4ka вне форума Ответить с цитированием
Старый 28.07.2014, 17:23   #2
zla9_kolu4ka
Форумчанин
 
Регистрация: 16.09.2013
Сообщений: 149
По умолчанию

Цитата:
А еще компиляторы умеют проверять границы массивов, соответствие типов, видеть x/0, оптимизировать... для вас это новость?
ты опять типа самый умный?
разобрался уже без тебя, можешь валить
zla9_kolu4ka вне форума Ответить с цитированием
Старый 28.07.2014, 17:26   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
разобрался уже без тебя
Поделись в чем там затык был.
Мне как Делфийцу интересно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.07.2014, 17:33   #4
zla9_kolu4ka
Форумчанин
 
Регистрация: 16.09.2013
Сообщений: 149
По умолчанию

Цитата:
Поделись в чем там затык был
Притом, что статиик, в данном случае, говорит что функция видна только в данном модуле трансляции.
И поэтому раз ее нет, то компилятор может установить ошибку, не вызыывая линковщик
zla9_kolu4ka вне форума Ответить с цитированием
Старый 28.07.2014, 17:51   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Надо запомнить на всяк случай... Я статики вне модуля не прописывал никогда.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.08.2014, 21:28   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Надо запомнить на всяк случай... Я статики вне модуля не прописывал никогда.
Как понять "вне модуля"?
Somebody вне форума Ответить с цитированием
Старый 02.08.2014, 21:51   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Как понять "вне модуля"?
Судя по контексту переписки, под "модулем" нужно понимать "единицу трансляции".

Любое объявление определяется в какой то единице трансляции, следовательно фраза "вне модуля" получается лишена смысла.

Возможно автор имел ввиду "не использовал ключевое слово static в хэдэре с целью ограничить область видимости объявления этой единицей трансляции".

Последний раз редактировалось _Bers; 02.08.2014 в 21:56.
_Bers вне форума Ответить с цитированием
Старый 02.08.2014, 22:22   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
не использовал ключевое слово static в хэдэре с целью ограничить область видимости объявления этой единицей трансляции
Скажу по-селянски: У меня весь код в одном СРР файле
Благо что проекты махонькие.
А "модуль" это я из Паскаля название привнес. Ну по вашему - хедер (видимо).
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.08.2014, 12:18   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А "модуль" это я из Паскаля название привнес. Ну по вашему - хедер (видимо).
Модуль - это единица трансляции.

А вот хэдэр - это заголовок, который может быть один на несколько единиц трансляций.
_Bers вне форума Ответить с цитированием
Старый 04.08.2014, 20:31   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
А вот хэдэр - это заголовок, который может быть один на несколько единиц трансляций.
Это как?
У единиц трансляций нет ничего общего. У каждой все свое. Если хедер включен, то включен целиком и все что в нем было полностью вставлено на место #include. В другой единице трансляции тоже самое.

Короче если речь об единицах трансляции, то и о трансляции. А во время трансляции никаких хедеров нету. Поэтому фраза получается лишена смысла.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проектирование компилятора rusfin01 Фриланс 0 15.04.2013 22:11
Создание компилятора Jaksn Помощь студентам 7 31.01.2013 22:46
Разработка компилятора Чай_ник Помощь студентам 20 17.01.2011 17:25
Определение компилятора AltF4 Общие вопросы C/C++ 4 11.08.2009 11:11
Исходники компилятора Simply-Art Свободное общение 1 08.07.2008 13:17