Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Неймспейсы C/C++  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3170
Всем привет

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

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

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

Собственно, сейчас что я пытаюсь понять
Меня интересует, как принято оформлять модули, доступные для Си и С++
Вот пишу я, например, набор дифайнов в хедере:
+
#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

На С++ есть неймспейсы, по идее можно обрамить скоуп неймспейсом
Но как принято поступать, если хедер можно использовать как в С, так и в С++?
6 фев 21, 15:03    [22276340]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Макросы вне неймспейсов, так что обломись в любом случае.

Posted via ActualForum NNTP Server 1.5

6 фев 21, 15:06    [22276343]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
SOFT FOR YOU
Я хоть и работал на С++ 2,5 года, но было это больше 10 лет назад
за такое время поменялось практически всё. Вам надо придумать маленький проект и пересмотреть в форуме концепции его воплощения.

SOFT FOR YOU
Хочу потягаться с известными парсерами XML/JSON
DOM или SAX парсер переписываем?
6 фев 21, 16:31    [22276377]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3170
PetroNotC Sharp,

Я вроде бы спросил не про проект, а про организацию модулей
Давай порассуждаем на эту тему
6 фев 21, 16:50    [22276384]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Если ты ориентируешься на чистый Си, то в нём ничего не поменялось за последние 10 лет.

Posted via ActualForum NNTP Server 1.5

6 фев 21, 17:18    [22276392]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3170
Я спрашиваю про С и С++
Зачем писать по 100500 реализация
В h/c основные модули (доступные как на Си, так и на С++)
В hpp/cpp шаблоны поверх h/c
6 фев 21, 17:30    [22276397]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
White Owl
Member

Откуда:
Сообщений: 12682
SOFT FOR YOU

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

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

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


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

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

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

Или можешь поиграться с GNU Autotools. Она рассчитана в первую очередь на разные версии gcc/g++, но зато покажет как можно автоматизировать создание платформенно-зависимого заголовка.
6 фев 21, 17:37    [22276399]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

SOFT FOR YOU
Я спрашиваю про С и С++

Тогда нужны два совершенно разных заголовка. Один для Си, другой для плюсов. И,
соответстенно, две разные библиотеки.

Posted via ActualForum NNTP Server 1.5

6 фев 21, 17:54    [22276402]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3170
White Owl,

Большое спасибо!
Так и буду делать
6 фев 21, 17:57    [22276403]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3170
Раз уж мы все здесь собрались, спрошу ещё вопросик
Какая-то фигня. Понять не могу

IDE CLion. CMakeLists:
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
#include "../powermm.hpp"
#include "../powermm.h"

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


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

// 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 пишу следующее, то проблем нет:
static void initialize_mempage(){}


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


При этом если то же самое делаю в *.hpp/*.cpp - то проблем нет
Как блин это возможно?
6 фев 21, 18:44    [22276409]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
SOFT FOR YOU,
Вопросы дилетанта
#include "../powermm.hpp"
#include "../powermm.h"
Зачем две строки, если достаточно заголовка?
2. Зачем нужно делать модули на чистом Си а не на плюсах?
6 фев 21, 18:54    [22276412]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

SOFT FOR YOU
Как блин это возможно?

Туевой хучей разных способов от невключения соответствующего объектника в список линковки
до опечатки в имени.

Posted via ActualForum NNTP Server 1.5

6 фев 21, 19:10    [22276419]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3170
PetroNotC Sharp,

Я же вроде уже описал
Функции доступны как на Си, так и на С++
В hpp плюсовые надстройки
6 фев 21, 19:33    [22276431]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
SOFT FOR YOU,
Ну я и спросил, зачем код держать в двух ипостасях?
Легаси код? Старый?
6 фев 21, 19:36    [22276432]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3170
PetroNotC Sharp,

Полно проектов на Си
За этим
6 фев 21, 19:38    [22276434]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

SOFT FOR YOU
Полно проектов на Си

Этим проектам парсинг ХМЛ напрочь не нужен.

Posted via ActualForum NNTP Server 1.5

6 фев 21, 19:41    [22276437]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3170
Dimitry Sibiryakov,

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

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

#ifndef POWERMM_H
#define POWERMM_H

void initialize_mempage();

#endif //POWERMM_H

#include "powermm.h"

void initialize_mempage(){}


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

Что ещё не хватает?
Мне кажется объектник пустой
Я давно не дизассемблировал объектники, там какая-то текстовая секция

К сообщению приложен файл (powermm.c.obj - 1Kb) cкачать
6 фев 21, 19:47    [22276443]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3170
Кстати если сделать так, то всё нормально
В чём прикол? )

#include "../powermm.c"
6 фев 21, 19:53    [22276449]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
SOFT FOR YOU,

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

Начинай с учебников, что такое инклюды, препроцессор, как работает static...

Сообщение было отредактировано: 6 фев 21, 19:56
6 фев 21, 20:02    [22276452]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3170
Siemargl,

То есть ты не знаешь, почему он не цепляет модуль?
Спасибо, ты очень помог
6 фев 21, 20:08    [22276456]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3170
Жесть

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

#ifndef POWERMM_H
#define POWERMM_H
#ifdef __cplusplus
extern "C" {
#endif

void initialize_mempage();

#ifdef __cplusplus
}
#endif
#endif //POWERMM_H


Так работает
6 фев 21, 20:13    [22276459]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
SOFT FOR YOU
Siemargl,

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

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

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

PS. И зачем тебе С? В Дельфи уже завезли компиляторы приличного качества.

Сообщение было отредактировано: 6 фев 21, 20:25
6 фев 21, 20:30    [22276465]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
petrav
Member

Откуда:
Сообщений: 2861
Siemargl
SOFT FOR YOU
Siemargl,

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

Просто теперь «модуль» — многозначное понятие в С++. Высказался товарищ корректно.
6 фев 21, 20:40    [22276470]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
SOFT FOR YOU,
>Зато C++ ты не прилинкуешь к Delphi
== вот я тоже на дельфи надцать лет не писал. Переведи что ты сказал. Хотя бы абзац текстом.
6 фев 21, 20:42    [22276471]     Ответить | Цитировать Сообщить модератору
 Re: Неймспейсы C/C++  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3170
PetroNotC Sharp,

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

Delphi позволяет линковать объектники, но куча ограничений
По именам функций и зависимостям
6 фев 21, 20:48    [22276476]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / C++ Ответить