powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Неймспейсы C/C++
25 сообщений из 34, страница 1 из 2
Неймспейсы C/C++
    #40042609
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет

Я хоть и работал на С++ 2,5 года, но было это больше 10 лет назад
Соответственно могу многое не знать
Даже самых элементарных вещей

Суть в чём
У меня есть библиотека Tiny.Library
Общий смысл такой. Низкоуровневый код пишется на Си (Clang), потом он компилируется на 5 операционных систем (по 2 битности), и уже *.o-файлы линкуются к Delphi

Данная схема хорошо работает. Но возникло желание расширять количество пользователей
Поэтому планирую добавлять поддержку С/С++ разных производителей. Хватило бы времени :)
Хочу потягаться с известными парсерами XML/JSON, плюс у меня там заложен формат сериализации, который просят внедрить в одном из предыдущих проектов
Получится/нет - другой вопрос :)

Собственно, сейчас что я пытаюсь понять
Меня интересует, как принято оформлять модули, доступные для Си и С++
Вот пишу я, например, набор дифайнов в хедере:
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
#if defined (__GNUG__) || defined (__cplusplus)
  #define CPP_COMPILER
#endif
#if defined (__clang__)
  #define CLANG_COMPILER
#elif defined (__INTEL_COMPILER)
  #define INTEL_COMPILER
#elif defined (__GNUC__)
  #define GCC_COMPILER
#endif
#if defined (_MSC_VER)
  #define MS_COMPILER
#endif
#if defined (MS_COMPILER) && !defined (CLANG_COMPILER)
  #define PUREMS_COMPILER
#endif
#if defined (CLANG_COMPILER) || defined (__GNUC__)
  #define GNU_ATTRIBUTES
#endif

#if defined (PUREMS_COMPILER)
  #if defined (_M_ARM64)
    #define CPUARM
    #define CPUARM64
  #elif defined (_M_ARM)
    #define CPUARM
    #define CPUARM32
  #elif defined (_WIN64)
    #define CPUINTEL
    #define CPUX64
  #else
    #define CPUINTEL
    #define CPUX86
  #endif
#else
  #if defined (__i386__)
    #define CPUINTEL
    #define CPUX86
  #endif
  #if defined (__x86_64__)
    #define CPUINTEL
    #define CPUX64
  #endif
  #if defined (__arm__)
    #define CPUARM
    #define CPUARM32
  #endif
  #if defined (__aarch64__)
    #define CPUARM
    #define CPUARM64
  #endif
#endif

#if defined (PUREMS_COMPILER)
  #define likely(expr) (expr)
  #define unlikely(expr) (expr)
#else
  #define likely(x) __builtin_expect(!!(x), 1)
  #define unlikely(x) __builtin_expect(!!(x), 0)
#endif

#if defined (CPUX86) || defined (CPUARM32)
  #define LITTLEREG
  #define SMALLINT
#else
  #define LARGEINT
#endif
#if defined (PUREMS_COMPILER) && defined (SMALLINT)
  #define native_int __int32
  #define native_uint __uint32
#elif defined (PUREMS_COMPILER) && defined (LARGEINT)
  #define native_int __int64
  #define native_uint __uint64
#else
  #define native_int __INTPTR_TYPE__
  #define native_uint __UINTPTR_TYPE__
#endif



Все модули моей библиотеки используют этот хедер
Соответственно все проекты, которые задействуют мою библиотеку - будут видеть данные дифайны

Этот подход нормальный?
Я, например, боюсь, если у кого-то переопределён дифайн likely или тип native_uint
Хочу ещё добавить популярный дифайн offsetof

На С++ есть неймспейсы, по идее можно обрамить скоуп неймспейсом
Но как принято поступать, если хедер можно использовать как в С, так и в С++?
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042610
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Макросы вне неймспейсов, так что обломись в любом случае.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042630
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU
Я хоть и работал на С++ 2,5 года, но было это больше 10 лет назад
за такое время поменялось практически всё. Вам надо придумать маленький проект и пересмотреть в форуме концепции его воплощения.

SOFT FOR YOU
Хочу потягаться с известными парсерами XML/JSON
DOM или SAX парсер переписываем?
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042637
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Я вроде бы спросил не про проект, а про организацию модулей
Давай порассуждаем на эту тему
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042644
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ты ориентируешься на чистый Си, то в нём ничего не поменялось за последние 10 лет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042647
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я спрашиваю про С и С++
Зачем писать по 100500 реализация
В h/c основные модули (доступные как на Си, так и на С++)
В hpp/cpp шаблоны поверх h/c
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042649
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU

Соответственно все проекты, которые задействуют мою библиотеку - будут видеть данные дифайны

Этот подход нормальный?
Я, например, боюсь, если у кого-то переопределён дифайн likely или тип native_uint
Хочу ещё добавить популярный дифайн offsetof
Да, этот подход нормальный и стандартный.
Если нужно определять и переопределять "стандартные" типы - делают гирлянду ifdef завязанную на компилятор и платформу (как ее сообщает компилятор).

Если не хочешь делать большой ifdef, то можно вынести все компиляторо-платформенные вещи в отдельные файлы. А поверх них делаешь один общий заголовочный файл в котором уже
Код: plaintext
1.
2.
3.
4.
5.
#ifdef __platformA
  #include "platformA.h"
#elif __platformB
  #include "platformB.h"
#endif



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

Чаще всего комбинируют эти подходы. На уровне ОС (windows/linux/etc) делают разные каталоги-файлы, потому что это легко понимать и поддерживать. А компиляторно-разрядный зоопарк разрешают ifdef'ами.

За примерами ходи в большие библиотеки - Qt, wxWidgets.

Или можешь поиграться с GNU Autotools. Она рассчитана в первую очередь на разные версии gcc/g++, но зато покажет как можно автоматизировать создание платформенно-зависимого заголовка.
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042651
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЯ спрашиваю про С и С++

Тогда нужны два совершенно разных заголовка. Один для Си, другой для плюсов. И,
соответстенно, две разные библиотеки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042652
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

Большое спасибо!
Так и буду делать
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042656
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз уж мы все здесь собрались, спрошу ещё вопросик
Какая-то фигня. Понять не могу

IDE CLion. CMakeLists:
Код: sql
1.
2.
3.
4.
cmake_minimum_required(VERSION 3.16)
project(develop)
set(CMAKE_CXX_STANDARD 14)
add_executable(develop main.cpp ../powermm.h ../powermm.c ../powermm.hpp ../powermm.cpp)



В main.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#include "../powermm.hpp"
#include "../powermm.h"

int main() {
    initialize_mempage();
    return 0;
}



Пустые файлы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
// powermm.h
#ifndef POWERMM_H
#define POWERMM_H

#endif //POWERMM_H

// powermm.c
#include "powermm.h"


// powermm.hpp
#ifndef POWERMM_HPP
#define POWERMM_HPP

#endif //POWERMM_HPP

// powermm.cpp
#include "powermm.hpp"



Если в powermm.h пишу следующее, то проблем нет:
Код: plaintext
1.
static void initialize_mempage(){}



Но если пишу void initialize_mempage();, а в реализации void initialize_mempage(){} - то возникает ошибка:
неопределённая ссылка на «initialize_mempage()»

При этом если то же самое делаю в *.hpp/*.cpp - то проблем нет
Как блин это возможно?
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042657
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,
Вопросы дилетанта
#include "../powermm.hpp"
#include "../powermm.h"
Зачем две строки, если достаточно заголовка?
2. Зачем нужно делать модули на чистом Си а не на плюсах?
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042658
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUКак блин это возможно?

Туевой хучей разных способов от невключения соответствующего объектника в список линковки
до опечатки в имени.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042664
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Я же вроде уже описал
Функции доступны как на Си, так и на С++
В hpp плюсовые надстройки
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042665
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,
Ну я и спросил, зачем код держать в двух ипостасях?
Легаси код? Старый?
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042667
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Полно проектов на Си
За этим
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042669
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUПолно проектов на Си

Этим проектам парсинг ХМЛ напрочь не нужен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042674
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Зато C++ ты не прилинкуешь к Delphi
Не о том ты сейчас

Вот смотри. Он создаёт 2 объектных файла: powermm.c.obj и powermm.cpp.obj

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#ifndef POWERMM_H
#define POWERMM_H

void initialize_mempage();

#endif //POWERMM_H

#include "powermm.h"

void initialize_mempage(){}



СМейкЛист:
Код: plaintext
1.
2.
3.
cmake_minimum_required(VERSION 3.16)
project(develop)
set(CMAKE_CXX_STANDARD 14)
add_executable(develop main.cpp ../powermm.h ../powermm.c)

Что ещё не хватает?
Мне кажется объектник пустой
Я давно не дизассемблировал объектники, там какая-то текстовая секция
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042679
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати если сделать так, то всё нормально
В чём прикол? )

Код: plaintext
1.
#include "../powermm.c"
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042682
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Поздравляю, всего 15 лет, и ты перешел на новую ступень развития - нулевый сишник!

Начинай с учебников, что такое инклюды, препроцессор, как работает static...
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042686
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,

То есть ты не знаешь, почему он не цепляет модуль?
Спасибо, ты очень помог
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042688
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жесть

Ребят, ну вы чё?
Могли бы подсказать )

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#ifndef POWERMM_H
#define POWERMM_H
#ifdef __cplusplus
extern "C" {
#endif

void initialize_mempage();

#ifdef __cplusplus
}
#endif
#endif //POWERMM_H



Так работает
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042691
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU
Siemargl,

То есть ты не знаешь, почему он не цепляет модуль?
Спасибо, ты очень помог
Модули появились в С++20, т.е ты не владеешь терминологией.

Последуя моему совету, ты сэкономишь время на изучение С.

С++ можешь и не начинать, если у тебя нет эликсира вечной молодости.

PS. И зачем тебе С? В Дельфи уже завезли компиляторы приличного качества.
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042694
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
SOFT FOR YOU
Siemargl,

То есть ты не знаешь, почему он не цепляет модуль?
Спасибо, ты очень помог
Модули появились в С++20, т.е ты не владеешь терминологией.

Просто теперь «модуль» — многозначное понятие в С++. Высказался товарищ корректно.
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042695
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,
>Зато C++ ты не прилинкуешь к Delphi
== вот я тоже на дельфи надцать лет не писал. Переведи что ты сказал. Хотя бы абзац текстом.
...
Рейтинг: 0 / 0
Неймспейсы C/C++
    #40042698
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Ну имена функция на С и С++ разные
Которые попадают в *.obj файл

Delphi позволяет линковать объектники, но куча ограничений
По именам функций и зависимостям
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Неймспейсы C/C++
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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