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

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

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

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

21.08.2012, 09:02. Просмотров 2446. Ответов 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
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,244
22.08.2012, 02:38 #31
Цитата Сообщение от alkagolik Посмотреть сообщение
а зачем писать так? а ведь пишут...
Цитата Сообщение от alkagolik Посмотреть сообщение
C++
1
2
3
#if 0
...
#endif
ты не поверишь, это один из способов выбросить из компиляции участок кода
некоторые комментируют, а некоторые вот так выбрасывают

C++
1
2
3
#if 0
int m=fn();
#endif
равно
C++
1
//int m=fn();
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.08.2012, 02:39 #32
Цитата Сообщение от ValeryS Посмотреть сообщение
Зачем?
Дальше-то это можно использовать, но, в данном примере, задача ведь совсем другая. Не пойму о чём alkagolik спорит? Можно написать и так, как он написал, и потом использовать, но для данного примера как? Задача была, чтобы участок кода от #ifndef и до #endif был включён в программу один раз.
0
alkagolik
Заблокирован
22.08.2012, 02:52 #33
alsav22, ну юморист. 1. Сначала в оригинале почитай. 2. О чем говорит твой скрин? НИАЧОМ.

Цитата Сообщение от ValeryS Посмотреть сообщение
по русски будет звучать так
если макрос HEADER_H не определен определить его
и ВСЕ никаких больше действий
вот я и спрашиваю Зачем?
переопределения никто не отменял
ок. а если в *.cpp или смежном *.h мы встретим такой участок?
C
1
2
3
4
5
6
7
8
9
#ifdef HEADER_H
    #define do { \
        ...\
    } while (0)
#else
    #define do { \
        ... \
    } while(0)
#endif
Цитата Сообщение от ValeryS Посмотреть сообщение
и твой код аналогичен
нет. не аналогичен. потому что "если не объявлен объявить", а не "объявить".
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.08.2012, 02:55 #34
Сначала в оригинале почитай.
Куда уж нам...

Цитата Сообщение от alkagolik Посмотреть сообщение
О чем говорит твой скрин? НИАЧОМ.
Загадками будете говорить или может объясните?
0
alkagolik
Заблокирован
22.08.2012, 03:00 #35
Цитата Сообщение от alsav22 Посмотреть сообщение
Загадками будете говорить или может объясните?
в том то и дело что мне нечего объяснять. ты уж прости если огорчил. А вот я как раз требую объяснений по вопросу в том где я не прав, почему и как правильно.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.08.2012, 03:11 #36
Цитата Сообщение от alkagolik Посмотреть сообщение
почему и как правильно.
Это тоже не то ? Л.Лафоре. ООП в С++.
0
Миниатюры
Как сделать чтобы функция была видна из .cpp файла?  
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.08.2012, 03:17 #37
Это? Стивен Прата. Язык Программирования C++. Лекции И Упражнения.
Всё не то?
0
Миниатюры
Как сделать чтобы функция была видна из .cpp файла?   Как сделать чтобы функция была видна из .cpp файла?  
alkagolik
Заблокирован
22.08.2012, 03:25 #38
Цитата Сообщение от alsav22 Посмотреть сообщение
Всё не то?
почему же не то? то. Только я не вижу расхождений с приведенным мной примером.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.08.2012, 03:32 #39
Пример этот? Или какой-нибудь другой?
C++
1
2
3
4
5
6
7
#ifndef HEADER_H
#define HEADER_H
#endif
 
#include <iostream>
 
extern void foo();
Добавлено через 4 минуты
Цитата Сообщение от alkagolik Посмотреть сообщение
вот я как раз требую объяснений по вопросу в том где я не прав, почему и как правильно.
Если хотите, давайте остановимся на вопросе: "...и как правильно." Правильно что? О чём, вообще, разговор? Может мы о разном?
0
alkagolik
Заблокирован
22.08.2012, 03:51 #40
alsav22, может и о разном. Только у тебя в #26 цитата:
Стоять должен там, где нужно.
вот мне и интересно, а где же нужно, и где эти жесткие ограничения? или среднестатистический плюсовик пишет исключительно по чьей-то инструкции? (только для себя конечно). То что я написал никак не противоречит стандартам, а мне начинают втирать что "вот так нужно!". И вообще тот кто изначально втер сопит преспокойно.
Я наверное сейчас бухать пойду, так что если есть вопросы - задавай.

Добавлено через 6 минут
Цитата Сообщение от defer Посмотреть сообщение
тут extern не нужен
Code-Blocks
не потому что codeblocks, а потому что c++
0
alsav22
22.08.2012, 03:58
  #41

Не по теме:

Цитата Сообщение от alkagolik Посмотреть сообщение
Стоять должен там, где нужно.
Тут я не имел ввиду какие-то инструкции. Имелось ввиду, как нужно тому, кто код пишет. Я же дальше написал, что можно написать и по вашему, и использовать это в программе. Ничему ваш код не противоречит. Просто разговор о другом зашёл, а именно: как избежать многократного включения заголовочного файла (и ТС тут не причём, у него причина совсем в другом была). Как использовать ваш код для решения именно этой задачи, я не пойму. А в остальном, хозяин - барин.

0
alkagolik
Заблокирован
22.08.2012, 04:12 #42
Цитата Сообщение от ValeryS Посмотреть сообщение
ты не поверишь, это один из способов выбросить из компиляции участок кода
некоторые комментируют, а некоторые вот так выбрасывают
ты не поверишь. это различие между релиз и дебаг компиляцией.

Добавлено через 13 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Стоять должен там, где нужно.
Цитата Сообщение от alsav22 Посмотреть сообщение
Ничему ваш код не противоречит.
ну бывает. я понимаю, ошибочно включился в спор, сам не понял о чем спор и т.д. у всех бывает. Все мы не ангелы. Пойду бухать
0
alsav22
22.08.2012, 04:26
  #43

Не по теме:

Цитата Сообщение от alkagolik Посмотреть сообщение
Все мы не ангелы.
Это точно.

0
alkagolik
Заблокирован
22.08.2012, 04:55 #44
ну вот еще напоследок
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
indicator@pc-host:~$ cat test.c 
#include "header.h" 
 
int main() {
#undef HEADER_H 
    foo();
#define HEADRE_H
    return 0;
}
indicator@pc-host:~$ cat foo.c 
#include "header.h"
 
void foo(){
    fprintf(stdout, "%s\n", "I'm foo");
}
indicator@pc-host:~$ cat header.h 
#ifndef HEADER_H
#define HEADER_H
#endif
#include <cstdio>
 
void foo();
indicator@pc-host:~$ g++ test.c foo.c 
indicator@pc-host:~$ ./a.out 
I'm foo
indicator@pc-host:~$
данная констукция демострирует что нам как бэ по хер и мы все равно дополняем свой код библиотеками cstdio.
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
22.08.2012, 19:20 #45
alkagolik, все элементарно. Есть у нас заголовочный файл с некой константой:
C++
1
2
3
// constant.h
 
const int constant = 0;
Теперь мы берем и включаем его два раза в исходный файл:
C++
1
2
3
4
5
// main.cpp
#include "constant.h"
#include "constant.h"
 
int main() { }
После препроцессирования получаем:
C++
1
2
3
4
5
6
// main.cpp
 
const int constant = 0;
const int constant = 0;
 
int main() { }
Как видим constant определена дважды, что нарушает One Definition Rule и о чем нам скажет компилятор.
Header guards решают эту проблему. Вот правильный Header guard:
C++
1
2
3
4
5
6
7
// constant.h
#ifndef CONSTANT_H
#define CONSTANT_H
 
const int constant = 0;
 
#endif
В ходе препроцессирования второго включения все расположенное между #ifndef .. #endif будет вырезано, т.к. CONSTANT_H будет определена в ходе обработки первого включения, т.е. мы получим:
C++
1
2
3
4
5
// main.cpp
 
const int constant = 0;
 
int main() { }
Как видим определение одно и все прекрасно компиляется.
Теперь твой вариант:
C++
1
2
3
4
5
6
// constant.h
#ifndef CONSTANT_H
#define CONSTANT_H
#endif
 
const int constant = 0;
Опять же препроцессор вырезает все между #ifndef .. #endif при обработке второго включения, но т.к. определение constant не находится между этим директивами оно успешно попадает в main.cpp второй вариант, тем сымым возвращая нас к исходной проблеме двух определений.
0
22.08.2012, 19:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2012, 19:20
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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