Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
#1

Как сделать чтобы функция была видна из .cpp файла? - C++

21.08.2012, 09:02. Просмотров 2465. Ответов 51
Метки нет (Все метки)

У меня есть 3 файла: main.cpp, 1.h, 1.cpp. Все делаю по книге, но получается так, что определение функции не видно из main().cpp

main.cpp
C++
1
2
3
4
5
6
7
8
#include "1.h"
 
int main()
{
   func1();  // Ошибка. Undefined reference to 'func1(void)'
 
   return 0;
}
1.h
C++
1
void func1();  // прототип функции
1.cpp
C++
1
2
3
4
5
#include "1.h"
void func1()     // определение функции
{
   //...
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2012, 09:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать чтобы функция была видна из .cpp файла? (C++):

Как объявить переменную так, чтобы она была видна в .h файле? - C++
День всем добрый! Допустим, есть у меня код в главном .cpp файле: #include "Windows.h" #include "my.h" using namespace...

Экземпляр в хедере. Обьект в меин. Функция в cpp модифицирует поле обьекта. Как сделать? - C++
Как сделать что бы void modif() изменял значение поля hours для обьекта st2. Есть 3 файла: 1.h 2.cpp main.cpp 1.h class...

как сделать программно чтобы программа была постоянно на заднем плане - C++
Суть вопроса как сделать программно чтобы программа была постоянно на заднем плане? Пишу экранную клавиатуру, как делать имитацию...

Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? - C++
Друзья! Дело в следующем, вот у меня есть функции X и Y. И вот мне не хотелось бы вызывать X прежде, чем будет вызвана Y. Но это всё в...

Программа работает только с одним разрешением экрана, как сделать чтобы она была универсальна - C++
Написал простенький кликер на с++, который в игре нажимает кнопочки от 1 до 9, сделал зависимости нажатия кнопочек от того что происходит...

как сделать так чтобы была возможность записывать и фамилию и имя,а то у меня только до пробела читает? - C++
здраствуйте!скажите пож-та как сделать так чтобы была возможность записывать и фамилию и имя,а то у меня только до пробела читает? ...

51
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
21.08.2012, 11:06 #16
ребята, я не пойму, что вы все про линкер беседуете, если ошибку компилятор выдает?
интел-лект, попробуй "спрятать" куда-нибудь файл 1.h (переименуй, например). изменится ли сообщение об ошибке?
если нет - замени
C++
1
#include "1.h"
на
C++
1
void func1();
и посмотри, станет ли все хорошо. доложи результат.
1
Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
21.08.2012, 11:50  [ТС] #17
novi4ok, Я сначала переименовал 1.h в 11.h. Так получается две ошибки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <windows.h>
#include "1.h"              // \main\main.cpp|3|error: 1.h: No such file or directory|
using namespace std;
 
 
int main()
{
    func1();   \main\main.cpp|10|error: 'func1' was not declared in this scope|
 
    system("pause");
    return 0;
}
А когда строчку
C++
1
#include "1.h"
заменил на
C++
1
void func1();
, то осталась одна ошибка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <windows.h>
void func1();
using namespace std;
 
int main()
{
    func1();   // \main\main.cpp|9|undefined reference to `func1()'|
 
    system("pause");
    return 0;
}
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
21.08.2012, 11:57 #18
Цитата Сообщение от Intel~lect Посмотреть сообщение
когда строчку
C++
1
#include "1.h"
заменил на
C++
1
void func1();
, то осталась одна ошибка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <windows.h>
void func1();
using namespace std;
 
int main()
{
    func1();   // \main\main.cpp|9|undefined reference to `func1()'|
 
    system("pause");
    return 0;
}
значит, ребята правы, и это у тебя - сообщение линкера. он почему-то не знает, где искать эту функцию. как ему об этом сообщить - без понятия. попробуй найти где-нибудь документацию, там - параметры этого линкера, как ему указать, что в сборку нужно включить модуль с этой ф-ей (1.obj обычно), или директорию указать, где ссылки разрешать, или ...
1
alkagolik
Заблокирован
21.08.2012, 18:46 #19
1. settings->compiler and debugger->global compiler settings->toolchain executables
поле linker for dynamic libs должно содержать "g++"
2. Проект должен быть создан как проект с++
3. Все компилируемые файлы и все заголовочные файлы должны быть добавлены в проект
1
Миниатюры
Как сделать чтобы функция была видна из .cpp файла?  
Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
21.08.2012, 19:34  [ТС] #20
alkagolik, Спасибо! Все таки получилось сделать эту программу.

Не по теме:

Целый день ушел на нее

0
-=ЮрА=-
Заблокирован
Автор FAQ
21.08.2012, 23:05 #21
Intel~lect, вот обещанные мной скрины Кодблокс(всё делается довольно просто)
2
Миниатюры
Как сделать чтобы функция была видна из .cpp файла?   Как сделать чтобы функция была видна из .cpp файла?   Как сделать чтобы функция была видна из .cpp файла?  

Как сделать чтобы функция была видна из .cpp файла?   Как сделать чтобы функция была видна из .cpp файла?  
CyBOSSeR
Эксперт С++
2307 / 1680 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
21.08.2012, 23:56 #22
Цитата Сообщение от alkagolik Посмотреть сообщение
C++
1
2
3
4
5
#ifndef HEADER_H
#define HEADER_H
#endif
#include <iostream>
extern void foo();
extern не нужен. #endif должен быть в конце файла.
0
alkagolik
Заблокирован
22.08.2012, 01:12 #23
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
extern не нужен. #endif должен быть в конце файла.
обоснуй. Про extern понял ранее, обоснуй #endif. Почему именно должен? Кто обяазал и где?
0
ValeryS
Модератор
6794 / 5202 / 499
Регистрация: 14.02.2011
Сообщений: 17,453
22.08.2012, 01:22 #24
Цитата Сообщение от alkagolik Посмотреть сообщение
Про extern понял ранее, обоснуй #endif.
Ну это то элементарно
вся эта связка делается для того чтобы при компиляции тело файла включалось один раз
например
C++
1
2
3
4
5
6
7
8
#ifndef HEADER_H // при первом включении HEADER_H  не определен соответственно
                         // все что до #endif будет компилироваться
                          // при последующих выбрасывается 
#define HEADER_H  // здесь определяем при первом включении
 
#include <iostream>
extern void foo();
#endif
http://ru.wikipedia.org/wiki/Include_guard
разумеется файл HEADER.H должен быть присоединен в нескольких файлах, иначе смысла в этом изврате нет
в VS20xx уже используется
#pragma once
http://ru.wikipedia.org/wiki/Pragma_once
0
alkagolik
Заблокирован
22.08.2012, 01:41 #25
ValeryS, прости, но ты не объяснил почему именно #endif должен стоять в конце файла. Всё что ты скаазал никак не идет в разрез с тем что у меня написано. В моем примере #endif завершает #ifndef. Дальше трансляция идет "построчно". Я что - то не понимаю.

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
в VS20xx уже используется
я рад .

Добавлено через 3 минуты
нет. я понимаю что возможно libc *.h никогда не открывались и не читались чтобы подобное заявить. Мне интересно откуда такая уверенность что так дОлжно. Дай мне источник и я заткнусь.

Еще я могу предположить что моя редакция противоречит именно c++ нотации (я слабо с ней знаком), тогда мне так же итересно знать где и почему я не прав.
0
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.08.2012, 01:55 #26
Цитата Сообщение от alkagolik Посмотреть сообщение
почему именно #endif должен стоять в конце файла.
Стоять должен там, где нужно. Если выражение #ifndef HEADER_H истинно, то будет компилироваться то, что находится между #ifndef и #endif, если нет, то этот участок кода игнорируется.
0
ValeryS
Модератор
6794 / 5202 / 499
Регистрация: 14.02.2011
Сообщений: 17,453
22.08.2012, 02:01 #27
alkagolik,
извини не понял вопроса

Не по теме:

то то я думаю с такой репутацией , а таких вещей не знает
ну ладно пускай начинающие прочтут, авось узнают


Цитата Сообщение от alkagolik Посмотреть сообщение
В моем примере #endif завершает #ifndef. Дальше трансляция идет "построчно". Я что - то не понимаю.
в твоем примере это вообще не нужно
ты обрамляешь макрос, зачем?
C++
1
2
3
#ifndef HEADER_H
#define HEADER_H
#endif
Цитата Сообщение от alkagolik Посмотреть сообщение
Мне интересно откуда такая уверенность что так дОлжно
так делают.
а зачем я тебе привел ссылки
а то что ты написал, я не понял зачем здесь условная компиляция?
0
alkagolik
Заблокирован
22.08.2012, 02:21 #28
Цитата Сообщение от ValeryS Посмотреть сообщение
в твоем примере это вообще не нужно
ты обрамляешь макрос, зачем?
а зачем писать так? а ведь пишут...
C
1
2
3
#if 0
...
#endif
Цитата Сообщение от ValeryS Посмотреть сообщение
зачем здесь условная компиляция?
Я говорю компилятору что if not defined FILE_H define FILE_H. Дальше в FILE_H выполняются инструкции, но если он not defined то эти инструкции молча канут в лету. А я оказывается предусмотрел и предупредил компилятор что if not defined FILE_H define FILE_H.
Цитата Сообщение от alsav22 Посмотреть сообщение
Стоять должен там, где нужно.
где написано? дай источник.
0
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.08.2012, 02:31 #29
Цитата Сообщение от alkagolik Посмотреть сообщение
где написано? дай источник.
Герберт Шилдт. Полный справочник по C++.
0
Миниатюры
Как сделать чтобы функция была видна из .cpp файла?  
ValeryS
Модератор
6794 / 5202 / 499
Регистрация: 14.02.2011
Сообщений: 17,453
22.08.2012, 02:31 #30
Цитата Сообщение от alkagolik Посмотреть сообщение
Я говорю компилятору что if not defined FILE_H define FILE_H. Дальше в FILE_H выполняются инструкции, но если он not defined то эти инструкции молча канут в лету. А я оказывается предусмотрел и предупредил компилятор что if not defined FILE_H define FILE_H.
Переведи


твой код
C++
1
2
3
#ifndef HEADER_H
#define HEADER_H
#endif
по русски будет звучать так
если макрос HEADER_H не определен определить его
и ВСЕ никаких больше действий
вот я и спрашиваю Зачем?
переопределения никто не отменял
и твой код аналогичен
C++
1
#define HEADER_H
0
22.08.2012, 02:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2012, 02:31
Привет! Вот еще темы с ответами:

Как сделать так чтобы при каждом выделении памяти в методе была возможность ее очистить и вернуть результат? - C++
Доброго времени суток! Есть код класса и хотелось бы устранить в нем следующие недочеты: 1) Как сделать так чтобы при каждом выделении...

Как сделать так чтобы переменная в описании одной функции была доступна в описании другой? - C++
Как сделать так чтобы переменная в описании одной функции была доступна в описании другой? Заранее спасибо.

Как сделать, чтобы функция считала с точностью до - C++
Здравствуйте. Нужно написать программу. выполнил все пункты кроме одного. А именно, не знаю как сделать, чтобы функция считала с точностью...

Как сделать, чтобы функция возвращала массив? - C++
Доброго времени суток! Есть функция которая находит значения 4х элементов массива. как сделать чтобы она возвращала сразу весь массив?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru