2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5, 6  След.
 
 
Сообщение26.12.2018, 08:35 
Аватара пользователя


10/10/18
754
At Home
Вот небольшая тема на RSDN про "эти строки" (2010): http://rsdn.org/forum/cpp/3755724.all

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение26.12.2018, 10:51 


27/08/16
10195
Вот описание ошибки, которую выдаёт MSVC2017: https://docs.microsoft.com/en-us/cpp/er ... ew=vs-2017

А, это именно опция
Код:
/permissive-


Но я не нашел это правило отбрасывания константности строк в стандарте (ISO/IEC 14882:2003(E)).

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение26.12.2018, 12:14 


11/12/14
893
https://en.cppreference.com/w/cpp/langu ... ng_literal
Цитата:
In C, string literals are of type char[], and can be assigned directly to a (non-const) char*. C++03 allowed it as well (but deprecated it, as literals are const in C++). C++11 no longer allows such assignments without a cast.

С++03 позволял, начиная с C++11 уже нельзя просто кастить литералы к неконстантным char*.
Вот про последнее сам не знал.

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение26.12.2018, 12:20 


27/08/16
10195
Да, в ISO/IEC 14882:2003(E) это преобразование описано в пункте 4.2 с примечанием, что оно depreciated. В имеющемся у меня драфте C++11 такого преобразования в этом пункте больше нет.

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение26.12.2018, 13:50 


07/08/14
4231
Насколько помню, константы отличаются от переменных только тем, что компилятор выдаст ошибку при компиляции, если встретит какое-либо присвоение константной переменной (даже её же значения) вне объявления типа.

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение26.12.2018, 14:59 
Заслуженный участник


28/04/09
1933
warlock66613 в сообщении #1363762 писал(а):
Да, онлайн-компиляторы независимо от выбранного стандарта (C++98, 11, 14) выдают только warning вроде такого: deprecated conversion from string constant to 'char*'.
В компиляторах по умолчанию отключён режим точного следования стандарту. В clang++ и g++ его можно включить с помощью флага -pedantic-errors (а лучше вдобавок выкрутить все предупреждения на максимум и превратить их в ошибки: -Wall -Wextra -Werror -pedantic-errors). В vc++ добиться точного следования стандарту довольно сложно, в VS 2017 для этого нужно использовать комбинацию флагов /std:<номер стандарта> /Za /permissive- /Wall /WX /EHsc /sdl, а также некоторые из флагов /Zc.

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 07:09 


28/07/17

317
upgrade в сообщении #1363808 писал(а):
Насколько помню, константы отличаются от переменных только тем, что компилятор выдаст ошибку при компиляции, если встретит какое-либо присвоение константной переменной (даже её же значения) вне объявления типа.

И я не могу использовать константы в объявлении класса (т.н. "хедер"). Потому что там нельзя инициализировать переменные, их можно только объявить. Инициализировать нужно в конструкторе класса, но присвоить там значение переменной, объявленной как константа - невозможно. Приходится делать их глобальными - ещё одно зло...

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 08:54 


07/08/14
4231
FomaNeverov в сообщении #1364208 писал(а):
Потому что там нельзя инициализировать переменные, их можно только объявить.

Я си++ практически не знаю. Когда то очень давно работал с просто си. Переменная в си - это кусок памяти с адресом и процедурой доступа к данным по этому адресу, а константа - это, при компиляции, готовое значение в машинном коде (по всей видимости у такой конструкции нет процедур доступа, или вернее они, эти значения, не выделены в машинном коде в виде отдельных адресов), таким образом для констант присвоения при работе программы как такогового нет - то что видит программист не равно тому что видит компилятор. Компилятор расставляет значение константы по всему коду так же как текстовый редактор заменяет одну фразу на другую. Т.е. "присвоение" происходит на этапе компиляции. Может быть в си++ инициализация - это выделение адресного пространства под объекты, но поскольку константа не переменная, то она и не объект - ей нельзя выделить адрес, и, соответственно инициализировать.

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 09:20 
Заслуженный участник


20/08/14
11760
Россия, Москва
upgrade в сообщении #1364225 писал(а):
константа - это, при компиляции, готовое значение в машинном коде (по всей видимости у такой конструкции нет процедур доступа, или вернее они, эти значения, не выделены в машинном коде в виде отдельных адресов)
Это верно только при одновременном соблюдении сразу многих условий: лишь для литералов, лишь простых типов, лишь некоторых архитектур (на некоторых невозможно поместить литерал в команду, да даже на x64 нет команд add/sub/cmp/and/or/xor/test RAX,imm64, одна лишь mov и всё), может быть компиляторно-оптимизаторно-зависимым. Т.е. очень и очень ограниченно, а не настолько универсально как Вы заявили. Зря Вы решили снова всё запутать.

 Профиль  
                  
 
 
Сообщение28.12.2018, 10:05 
Аватара пользователя


10/10/18
754
At Home
FomaNeverov в сообщении #1364208 писал(а):
И я не могу использовать константы в объявлении класса (т.н. "хедер").
How do I define an in-class constant? (Bjarne Stroustrup's C++ Style and Technique FAQ)

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 13:28 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Любопытно. А как мне написать что-то в виде
    Используется синтаксис C++
    class Y {
    public:
            static const double g = 9.8;    // error: not integral
            double weight (double m, double g_local = g) { return m*g_local; }
    };
?

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 13:40 
Заслуженный участник


02/08/11
7003
Munin, вынести инициализацию из класса в .cpp (.cc) файл:
Используется синтаксис C++
// Y.h:
class Y {
public:
        static const double g;
        double weight (double m, double g_local = g) { return m*g_local; }
};

// Y.cc:
const double Y::g = 9.8;


Не знаю, меняет ли что-нибудь в этом плане constexpr.

-- 28.12.2018, 14:51 --

UPD. Да, меняет: теперь можно просто заменить const на constexpr и всё заработает:
Используется синтаксис C++
class Y {
public:
        static constexpr double g = 9.8;
        double weight (double m, double g_local = g) { return m*g_local; }
};

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 14:25 


07/08/14
4231
Dmitriy40 в сообщении #1364228 писал(а):
лишь для литералов, лишь простых типов, лишь некоторых архитектур (на некоторых невозможно поместить литерал в команду, да даже на x64 нет команд add/sub/cmp/and/or/xor/test RAX,imm64, одна лишь mov и всё), может быть компиляторно-оптимизаторно-зависимым.

Ничего не понял из этого. В отношении моего вышесказанного, дополню схематично (мое сугубо личное представление, не претендующее на универсальность, с тем, с которым я работал):
Пишем
Код:
int i

Компилятор выделяет адрес для двух байт, который определяется как "адрес программного кода плюс (сместиться) столько-то байт по мнению компилятора".
При определенной сноровке, в этот адрес можно спокойно писать значения (в том числе и из других программ) так как адрес известен и залезть вместо одной переменной в другую не получится.
Пишем
Код:
const int i=1

Компилятор ищет везде в человеческом коде все i, заменяет их на 1, а затем формирует объектный код, в котором единица может находиться в середине блока с адресом "адрес программы по мнению компилятора" то есть внутри блока памяти с определенным адресом, выделенного компилятором для программного кода. И каким образом можно обратиться к такой единице (например, поменять ее на двойку) я вообще не представляю...указав вместо адреса команду, которая оперирует этой единицей?... ..не знаю.

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 14:32 
Заслуженный участник
Аватара пользователя


30/01/06
72407
warlock66613
Спасибо!

-- 28.12.2018 14:42:57 --

upgrade в сообщении #1364286 писал(а):
Компилятор выделяет адрес для двух байт

Э нет. Ситуация сильно разная для разных случаев:
- глобальные переменные, статические переменные функций и статические переменные классов;
- нестатические члены классов;
- локальные переменные функций и блоков; передаваемые в функцию параметры, иногда - возвращаемое значение;
- разнообразные компиляторные оптимизации от предыдущего пункта.

То, что вы описываете, подходит к п. 1, а в жизни чаще всего встречается (и по умолчанию подразумевается) п. 3.

upgrade в сообщении #1364286 писал(а):
Компилятор ищет везде в человеческом коде все i, заменяет их на 1

Опять же не совсем. Можно написать:


-- 28.12.2018 14:48:19 --

Правда, результат будет undefined behavior :-)

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 14:56 
Заслуженный участник
Аватара пользователя


16/07/14
9143
Цюрих
Начиная с C++17 можно писать просто
Используется синтаксис C++
struct X {
  inline static const double g = 1.5;
};

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 87 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group