C/C++ инструменты - их свежие версии

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

C/C++ инструменты - их свежие версии

Непрочитанное сообщение Olej » 11 фев 2021, 17:47

Это общеизвестно, что С и C++, как весьма старые языки, прошли (каждый по себе) через ряд стандартов, несовместимых меж собой сверху вниз.

Про C, существующим с 1970 года практически, одновременно с UNIX для которого и был создан, в сё более менее устаканившись ... про стандарты C я как-то даже написал обзор: Язык C: заметки на полях (2014г. ... я даже не вспомню по чьему заказу это делалось :-o ) - стандарты C89, C99.

По С++ стандартизация идёт более поздняя, более активная: C++11, C++14, C++17, C++20 ...

Но тема эта не (столько) про стандарты, сколько про инструменты: сами по себе языки - это система формализмов, соглашения ... а для работы с ними нужны инструменты и возникают вопросы:
- поддержки стандартов;
- информации по стандартам;
- совместимость инструментов;

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: C/C++ инструменты - версии

Непрочитанное сообщение Olej » 11 фев 2021, 18:06

Olej писал(а):
11 фев 2021, 17:47
- информации по стандартам;
В качестве обстоятельных онлайновых справочников по C++, с разграничениями по версиям языка, я знаю 2:

1. Standard C++ Library reference
C++98 C++11
2. C++ reference
C++98, C++03, C++11, C++14, C++17, C++20, C++23
P.S. Все остальные, которые мне встречались, или а). не обстоятельными, или б). не даёт чёткого разграничения для каких версий применимо.

P.P.S. Если со временем появится что-то ещё достояное, тоя его буду сюда просто вписывать.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: C/C++ инструменты - версии

Непрочитанное сообщение Olej » 11 фев 2021, 18:11

Olej писал(а):
11 фев 2021, 17:47
- поддержки стандартов;
Разговор вот о чём:

Код: Выделить всё

#include <iostream>
#include <set>

// https://en.cppreference.com/w/cpp/container/set/contains
int main()
{
    std::set<int> example = {1, 2, 3, 4};

    for(int x: {2, 5}) {
        if(example.contains(x)) {
            std::cout << x << ": Found\n";
        } else {
            std::cout << x << ": Not found\n";
        }
    }
}
Напарываемся на несовместимость версий:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/set$ make
g++ -Wall -pedantic -std=c++17 set.cc -o set
set.cc: In function ‘int main()’:
set.cc:11:20: error: ‘class std::set<int>’ has no member named ‘contains’
   11 |         if(example.contains(x)) {
      |                    ^~~~~~~~
make: *** [Makefile:9: set] Ошибка 1
И компилируется это только с стандарте C++20:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/set$ make
g++ -Wall -pedantic -std=c++2a set.cc -o set

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: C/C++ инструменты - версии

Непрочитанное сообщение Olej » 11 фев 2021, 18:16

Olej писал(а):
11 фев 2021, 18:11
Разговор вот очём:
... и о а). соответствии разных версий разных компиляторов стандартам + б). опций компилятора для указания стандарта:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/set$ make
g++ -Wall -pedantic -std=c++2a set.cc -o set

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/set$ g++ --version
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
И LLVM компилятор Clang:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/set$ clang++ set.cc -xc++ -std=c++20 -o set

Код: Выделить всё

olej@nvme:~$ clang --version
clang version 10.0.0-4ubuntu1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
P.S. Для проверки, в принципе, использую такой Makefile - комментируя в нём не нужные мне строки:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/set$ cat Makefile
TASK = set
#CXX += -Wall -pedantic -std=c++11
#CXX += -Wall -pedantic -std=c++14
#CXX += -Wall -pedantic -std=c++17
#CXX += -Wall -pedantic -std=c++2a
CXX = clang++ -xc++ -std=c++20

all: $(TASK)

%:      %.cc
    $(CXX) $< -o $@

clean:
    rm -f $(TASK)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: C/C++ инструменты - их свежие версии

Непрочитанное сообщение Olej » 09 мар 2021, 00:13

Olej писал(а):
11 фев 2021, 18:06
В качестве обстоятельных онлайновых справочников по C++, с разграничениями по версиям языка, я знаю 2:
Относительно синтаксических новинок, введенных с C++11 (последующие стандарты главным образом только углубляют их) есть очень хорошее обсуждение в книге, которая не совсем относится к этой теме:
Изображение
ПРИЛОЖЕНИЕ A. Краткий справочник
по некоторым конструкциям языка C++ ........ 437
A.1. Ссылки на r-значения ...................................................... 437
A.1.1. Семантика перемещения ................................................ 439
A.1.2. Ссылки на r-значения и шаблоны функций ...................... 442
A.2. Удаленные функции ........................................................ 442
A.3. Умалчиваемые функции .................................................. 445
A.4. constexpr-функции .......................................................... 449
A.4.1. constexpr и определенные пользователем типы .............. 450
A.4.2. constexpr-объекты .......................................................... 454
A.4.3.Требования к constexpr-функциям ................................... 454
A.4.4. constexpr и шаблоны ....................................................... 455
A.5. Лямбда-функции ............................................................ 456
A.5.1. Лямбда-функции, ссылающиеся на локальные переменные ... 458
A.6. Шаблоны с переменным числом параметров .................. 461
A.6.1. Расширение пакета параметров ..................................... 463
A.7. Автоматическое выведение типа переменной ................. 466
A.8. Поточно-локальные переменные .................................... 467
A.9. Резюме ........................................................................... 469
Про книгу подробнее, и то, как и где её свободно скачать, см. в теме: C++: параллельность, асинхронность, атомарность

P.S. Выше я написал "очень хорошее" - потому что не на уровне теоретических построений и академических нюансов, а "на пальцах" ровно в той мере и как, в какой эти новинки используются в технике параллельных вычислений... 32 страницы. :lol:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: C/C++ инструменты - их свежие версии

Непрочитанное сообщение Olej » 20 фев 2022, 16:36

Компилирую примеры к своей рукописи 2012г. ... которые многократно со всей тщательностью отрабатывались и компилировались.
И получаю (что там собиралось не принципиально важно):

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/SMP/examples.SMP.05/affinity$ make
gcc  -lpthread -lm tspeed.c common.c -o tspeed
/usr/bin/ld: /tmp/cc36uUlc.o: в функции «main»:
tspeed.c:(.text+0x2c5): неопределённая ссылка на «pthread_create»
/usr/bin/ld: tspeed.c:(.text+0x31b): неопределённая ссылка на «pthread_join»
/usr/bin/ld: /tmp/ccH0gSad.o: в функции «calibrate_for»:
common.c:(.text+0x33d): неопределённая ссылка на «round»
/usr/bin/ld: common.c:(.text+0x3c4): неопределённая ссылка на «round»
/usr/bin/ld: /tmp/ccH0gSad.o: в функции «set_active»:
common.c:(.text+0x43d): неопределённая ссылка на «round»
collect2: error: ld returned 1 exit status
make: *** [Makefile:10: tspeed] Ошибка 1
:-o

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: C/C++ инструменты - их свежие версии

Непрочитанное сообщение Olej » 20 фев 2022, 16:55

Olej писал(а):
20 фев 2022, 16:36
И получаю
Как выяснил поиск:
В последних версиях gccкомпилятора требуется, чтобы библиотеки следовали за объектами или исходными файлами.
Итак, для компиляции это должно быть:
gcc pthread_sample.c -lpthread
(выделено мной)

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/tasks-C/c_codes/array$ gcc --version
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Переделал (даже упростил) Makefile (для немного другого каталога, набора файлов):

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV/examples/afinity$ cat Makefile
CC = gcc
CFLAGS += -Wall
LDFLAGS += -lpthread

PROGLIST = how-many-p how-many-t

all: $(PROGLIST)

%: %.c
    $(CC) $< $(CFLAGS) -o $@ $(LDFLAGS)

clean:
    @rm -f *.o $(PROGLIST)
Теперь всё ОК:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV/examples/afinity$ ls *.c
how-many-p.c  how-many-t.c

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV/examples/afinity$ make clean

olej@R420:~/2022/own.BOOKs/BHV/examples/afinity$ make
cc how-many-p.c -Wall -o how-many-p -lpthread
cc how-many-t.c -Wall -o how-many-t -lpthread

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 12 гостей