Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Например есть header.h Код: plaintext 1. 2. 3. 4. 5. Пока у меня один CPP проблем нет, а он у меня обычно один, например first.cpp Код: plaintext 1. 2. 3. 4. Но если надо добавить second.cpp Код: plaintext 1. 2. 3. 4. то начинаются ошибки линковки Код: plaintext 1. Можно конечно на все функции в header.h дописать inline, только не надо. Вариант делать как положено с выносом тела в my_func.cpp не нравится, т.к. в новый проект придется все эти CPP добавлять, а их много. Повторюсь: в большинстве случаев проект из одного cpp и проблемы нет. Может есть в препроцессоре какая-нибудь доп.проверка чтобы что-то типа такого можно было написать в header.h Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Надо для MSVC 2015 и GCC ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 16:07 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Оберни свою функцию в темплейт. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 16:14 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Написал так Код: plaintext 1. 2. 3. 4. Не компилируется Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 16:43 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Убери аргумент. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 16:47 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Dima T, Если функция в хедере, то ее тело будет включено в каждую единицу трансляции, куда хедер включен. С этим вам нужно смириться. Остается устранить ошибки при линковке, связанные с дублированием функции. 1) Пометить функцию как static 2) Поместить функцию в анонимный неймспейс namespace {} 3) Поместить функцию в класс. 1 работает и для С и для С++, а 2 и 3 соответственно только для С++. Судя по всему у вас С++. В этом случае я бы выбрал способ 2, т.к. он во-первых рекомендуется как замена static, во-вторых все определения можно просто поместить внутрь namespace {} без редактирования, что намного упрощает процедуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 16:54 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Как? Пробовал так Код: plaintext 1. 2. Код: plaintext 1. 2. не компилируется. Как понимаю надо наоборот добавить аргумент. Так работает Код: plaintext 1. 2. 3. 4. вызов Код: plaintext 1. только это как-то черезжопно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 16:55 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky1) Пометить функцию как static 2) Поместить функцию в анонимный неймспейс namespace {} Спасибо. Оба варинта пригодятся. Некоторые функции такие: Код: plaintext 1. 2. 3. 4. тут с namespace две разные k создаются. Anatoly Moskovsky3) Поместить функцию в класс. Если я правильно помню, помещение метода в класс равносильно inline ? Код: plaintext 1. 2. 3. 4. 5. 6. т.е. my_method() будет всегда инлайнится в вызывающий код. Или я неправильно понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 17:16 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Dima TЕсли я правильно помню, помещение метода в класс равносильно inline ? Нет, это равносильно помещению его в namespace. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 17:23 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Dima TНекоторые функции такие: Код: plaintext 1. 2. 3. 4. тут с namespace две разные k создаются. Со static тоже. И это логично. Если вам нужен только один экземпляр функции, то наверно надо использовать inline. Если я правильно помню. Dima TЕсли я правильно помню, помещение метода в класс равносильно inline ? Да. Dima Tт.е. my_method() будет всегда инлайнится в вызывающий код. Или я неправильно понимаю? Нет. inline в С++ не означает что метод будет заинлайнен. Это просто подсказка компилятору про возможность инлайна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 17:27 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyСо static тоже. И это логично. Если вам нужен только один экземпляр функции, то наверно надо использовать inline. Если я правильно помню. Все правильно: static и namespace одинаковы. Две разные k. Это я коряво затестил. Был inline C inline один экземпляр k, т.е. так Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 18:12 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
В продолжение этой же темы. Надо static переменную в классе Можно написать так (в header.h) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Без namespace не компилируется, с ним ожидаемо получил два разных Test::x в разных .cpp так все нормально (общий x на оба .cpp) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. В принципе можно и так оставить, лишних букв немого добавилось, но как-то коряво смотрится. Может есть какая-нибудь хитрость чтобы первый вариант заработал как надо без namespace ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 10:38 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
а ключевое слово extern, интересно, тут сработает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 11:32 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Dima TМожет есть какая-нибудь хитрость чтобы первый вариант заработал как надо без namespace ?нужно в .cpp-файл инициализацию Test::x вынести ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 12:10 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
CEMbа ключевое слово extern, интересно, тут сработает? Если я его правильно понимаю, extern не может быть вместе с присвоением, т.е. такое невозможно Код: plaintext 1. не компилируется. Может еще куда его попробовать написать? эти не компилируются Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. тут куча ошибок: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Компилируется и правильно работает если вынести в один из .cpp Код: plaintext 1. Но это еще хуже чем вариант под спойлером 18676601 т.к. как уже писал в основном один .cpp в проекте и проблемы нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 12:30 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Глупый вопрос, а нафига нужно в .H имплементацию методов запихивать? Не проще из .H имплементацию перенести в отдельный .C/.CPP файл, а в .H, как и положено, оставить только объявление метода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 13:04 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
А, нет, extern тут только всё запутает. extern пугает компилятор, что реальное объявление будет в _другом_ месте. Т.е. кроме самого написания extern, нужно ещё объявление переменной в другом месте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 13:13 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevГлупый вопрос, а нафига нужно в .H имплементацию методов запихивать? чтобы написать Код: plaintext 1. и не заморачиваться на поиски .cpp для добавления в проект. Тем более что в этом h могут быть другие h упомянуты, у тех свои .cpp Проекты у меня небольшие, общего много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 13:14 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Странные какие-то "не заморачиваться". Всю жизнь давал .H и .CPP одинаковые имена. Никогда проблемы "добавить в проект" не было. Один раз добавил и на всю жизнь проекта дальше живешь счастливо. В конце концов, добавить все библиотечные .CPP скопом. AFAIK неиспользуемый код линковшик сам выбросит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 13:21 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
А ещё люди давным-давно придумали библиотеки. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 13:29 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
У меня тоже одноименные H и CPP. Но они могут по разным папкам живут. Например в одной общие для всех проектов, во второй для группы проектов, в третьей для конкретного проекта. Понятно что не смертельно потратить 10 сек на поиски нужной папки. Но еще лучше если не надо. И во-вторых: мне удобнее когда все в одном месте, а не размазано по двум файлам. Мысль собрать все вместе навеяна C# там именно так. PS Я на С/С++ немного пишу, некоторые вещи тут не так как везде, поэтому хочется унифицировать по возможности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 13:44 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Этот вариант тоже не взлетел :( Dima T Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Есть еще static метод (функция потока), а оттуда по нормальному не достучаться до x Похоже придется сделать CPP для этого случая ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 15:34 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Победил. Так компилируется и работает правильно Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 15:46 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Все гораздо проще , содержимое h файла заклчается в церебер вклчения. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Куда бы вы этот h файл не добавляли внутри проекта и сколько угодно раз цербер включения пропустит в линковку содержимое этого h файла только один раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 16:38 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
ДохтаР, Код: plaintext 1. это тоже самое. Только букв меньше. Стоит первой строчкой. Затестил церберов, не помогло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 16:48 |
|
||
|
Вопрос по препроцессору: возможно проверить что был include в другом cpp ?
|
|||
|---|---|---|---|
|
#18+
Dima TДохтаР, Код: plaintext 1. это тоже самое. Только букв меньше. Стоит первой строчкой. Затестил церберов, не помогло. Это должно быть в cpp файле. Код: plaintext 1. 2. 3. 4. Релазизацию функции вынесите в cpp в h оставьте только декларацию. Оно так задумывалось , что бы и вы и линкер смотрели в h файлы как в справочник -содержание, а простыни c реализацией должны быть в cpp. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2016, 17:17 |
|
||
|
|

start [/forum/topic.php?fid=57&gotonew=1&tid=2018640]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
115ms |
get topic data: |
11ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 233ms |

| 0 / 0 |
