powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вред от определения функций в хедерах
25 сообщений из 25, страница 1 из 1
Вред от определения функций в хедерах
    #39622259
Фотография Gobzo Kobler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ли вред от определения функций в хедерах? Понятно что их пытаются инлайнить, но ведь если она большая, то не инлайнят? Просто после шарп настолько влом менять что-то в двух местах...
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39622279
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gobzo KoblerЕсть ли вред от определения функций в хедерах?

Определи, пож., понятие "вред".
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39622289
Фотография Gobzo Kobler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

вред это как польза, только наоборот. я под ним понимаю все, что не следует делать
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39622311
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gobzo KoblerMasterZiv,

вред это как польза, только наоборот. я под ним понимаю все, что не следует делать

Тогда не делай определений функции в заголовках.
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39622323
Фотография Gobzo Kobler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Почему?
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39622372
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты попробуй:
Код: plaintext
1.
2.
3.
4.
5.
6.
 // foo.h
#include <iostream>

void foo() {
   std::cout << "foo()\n";
}



Код: plaintext
1.
2.
 // baz.h
void baz();



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 // baz.сpp
#include <iostream>
#include "foo.h"
#include "baz.h"

void baz() {
   std::cout << "baz()\n";
   foo();
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 // main.сpp
#include <iostream>
#include "foo.h"
#include "baz.h"

int main(int argc, char **argv) {
   std::cout << "main()\n";
   foo();
   baz();
}



А теперь собери это все в одну программу.
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39622382
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gobzo KoblerЕсть ли вред от определения функций в хедерах?
Есть вред.
1) Лишние зависимости между модулями (этого уже достаточно чтобы так не делать)
2) Бинарник больше.
3) Компиляция дольше.

White OwlА теперь собери это все в одну программу.
White Owl хочет сказать что если тело функции в хедере, то будет ошибка связывания из-за дублирования его в каждой единице трансляции.
Для борьбы с этим существуют inline, static и анонимный namespace - когда действительно в исключительных случаях требуется разместить тело функции хедере.
Влом - это не тот случай ))
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39622629
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gobzo Koblerвлом менять что-то в двух местах...не выдумывай) в двух местах надо менять только сигнатуру функции. Время, потраченное на это, исчезающе мало по сравнению с написанием собственно тела функции))
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39622631
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychв двух местах надо менять только сигнатуру функции

Видимо, как раз сигнатуру-то обленившиеся дот-нетчики и не могут правильно угадать с
первой попытки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39622633
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychне выдумывай) в двух местах надо менять только сигнатуру функции. Время, потраченное на это, исчезающе мало по сравнению с написанием собственно тела функции))
Кстати во многих IDE изменения в прототипе одним кликом можно скопировать на вторую копию.
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39622714
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gobzo Kobler...настолько влом менять что-то в двух местах...

MSVS-2017 (CE):
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39622864
Фотография Gobzo Kobler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасия,

ты конечно понимаешь, сколько кликанься вовлечено в использование этого диалога? это не облегчение, а издевательство.
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39622875
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gobzo Kobler,

объясни, в чем смысл твоего нытья? ТАК СДЕЛАНО. Изменить на "хочу не так, а эдак" - невозможно.
Все, что доступно - научиться пользоваться тем, что есть.

Аминь.
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39622927
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gobzo Koblerты конечно понимаешь, сколько кликанься вовлечено в использование этого диалога? это не облегчение, а издевательство.
В qtcreator проще ))
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39622948
Фотография Gobzo Kobler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда у меня такой вопрос:

Если в сольюшн есть главный проект и юнит-тест проект, в который добавлена ссылка на главный проект, то когда методы определены в .h, они видны и в юнит-тест проекте. Но если они только объявлены в .h, а определены в .cpp, то они не видны линкеру. inteli-sense в VS видит эти методы, но при линковке бросает ошибку

Error LNK2019 unresolved external symbol "public: static long __cdecl PCI::FileUtil::LineCount(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)"... referenced in function "public: void __thiscall UnitTest_::UnitTest::TestMethod_Parallel(void)"

Это происходит только в юнит-тест проекте. Главный проект использующий те же методы линкуется.

ЧЯНТД? После qtdeveloper и netbeans не очень понятно что означает добавление референс на главный проект, настраивает ли оно пути к заголовкам идт. По идее ведь inteli-sense увидел.

В главном проекте:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#pragma once
#ifndef FILEUTIL_H
#define FILEUTIL_H

#include <cstdlib>
#include <string>
#include <fstream>

namespace PCI {
    class FileUtil
    {
    public:
        FileUtil();
        virtual ~FileUtil();

        static long LineCount(const std::string&);
    };
}
#endif



Код: plaintext
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.
#include "stdafx.h"
#include "FileUtil.h"

using namespace std;
using namespace PCI;

FileUtil::FileUtil()
{
}

FileUtil::~FileUtil()
{
}

long FileUtil::LineCount(const std::string& file)
{
    ifstream firstStream(file.c_str());
    long lineCount = 0;
    string s;
    while (getline(firstStream, s))
    {
        lineCount++;
    }

    return lineCount;
}



В юнит-тест проекте:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include "stdafx.h"
#include <cstdlib>
#include "FileUtil.h"

using namespace std;
using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest_
{
    TEST_CLASS(UnitTest)
    {
    private:
    public:
        const string
             testFileName = "D:\\testFile.txt";

         TEST_METHOD(TestMethod_Parallel)
        {
            Assert::IsTrue(PCI::FileUtil::LineCount(testFileName) == 1000);
        }
    }
}
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39624365
Фотография Gobzo Kobler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Темплейты тоже работают только если методы определены в хедере. Смысла разбивать на h/cpp все меньше. Есть чем крыть?
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39624383
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gobzo KoblerТемплейты тоже работают только если методы определены в хедере. Смысла разбивать на h/cpp все меньше. Есть чем крыть?
Нет.
Ты выиграл.
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39624392
Фотография Gobzo Kobler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Я не выиграл - все мы проиграли :( Как реализованы шаблоны это просто что-то.
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39624414
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gobzo KoblerКак реализованы шаблоны это просто что-то.Да, и я тоже в восторге

Gobzo KoblerЯ не выиграл - все мы проиграли :(А про объектные файлы уже рассказывали?
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39624432
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА ты попробуй:
Код: plaintext
1.
2.
3.
4.
5.
6.
 // foo.h
#include <iostream>

void foo() {
   std::cout << "foo()\n";
}


...
А теперь собери это все в одну программу.
Элементарно, надо чуть подправить и соберется
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 // foo.h
#pragma once
#include <iostream>

static void foo() {
   std::cout << "foo()\n";
}
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39624438
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gobzo KoblerЕсть ли вред от определения функций в хедерах? Понятно что их пытаются инлайнить, но ведь если она большая, то не инлайнят? Просто после шарп настолько влом менять что-то в двух местах...
1. Медленнее компиляция
2. Не все конструкции возможно написать только в хэдерах, например такое
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 // foo.h
#include <baz.h>

void foo() {
   ...
   baz();
}


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 // baz.h
#include <foo.h>

void baz() {
   ...
   foo();
}



Недавно эту тему обсуждали
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39625212
Фотография Gobzo Kobler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Я бы за эти foo, bar и baz убивал. Серьезно.
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39625219
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gobzo KoblerDima T,

Я бы за эти foo, bar и baz убивал. Серьезно.
Убивать за простейшие примеры? А за реальный код тогда что? Четвертовать или распять?
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39625262
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TGobzo KoblerЕсть ли вред от определения функций в хедерах? Понятно что их пытаются инлайнить, но ведь если она большая, то не инлайнят? Просто после шарп настолько влом менять что-то в двух местах...
1. Медленнее компиляция
2. Не все конструкции возможно написать только в хэдерах, например такое
[/src]
Да можно все, только не так, а с форвард определениями.

Меня, например раздражают в шарпе простыни кода в определениях класса, вложенного класса, неймспейса, вложенного нейспейса итп.
Долбаная матрешка в простыне

Так эту дырищу заклеили скотчиком #region для студии, и все
...
Рейтинг: 0 / 0
Вред от определения функций в хедерах
    #39625292
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TУбивать за простейшие примеры?Подозреваю: за названия. Мне они тоже почему-то не нравятся. Но я их иногда тоже использую в примерах, редко-редко, обычно это названия со смыслом. А так, это похоже на использование "бла-бла-бла" в обычной речи, собственно, что и порождает желание прибить источник
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вред от определения функций в хедерах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]