Первым постом в этом канале станет тот, с которого зародилось название канала.
Долгие разборы "военного синуса" привели меня к квинтессенции проблем, после которых я сумел сконструировать несколько абсолютно отвратительных примеров выстрелов себе в ногу.
Вот такой код, очевидно, не скомпилируется.
Что логично. Мы, конечно, объявили синус от строки, но в глобальном пространстве имен. А вызываем
Но давайте поменяем местами объявление синуса и заголовок
Угадайте что? Правильно: скомпилируется!
А все почему? Правильно, потому что в заголовке cmath (во многих реализациях на linux) есть вот такая строчка:
Будьте осторожны. Она там такая не одна.
Долгие разборы "военного синуса" привели меня к квинтессенции проблем, после которых я сумел сконструировать несколько абсолютно отвратительных примеров выстрелов себе в ногу.
#include <iostream>
#include <cmath>
double sin(std::string x) { return 1.5; }
int main() {
std::cout << "string: " << std::sin(std::string{"0.5"}) << std::endl;
}
Вот такой код, очевидно, не скомпилируется.
<source>:7:40: error: no matching function for call to 'sin(std::string)'
Что логично. Мы, конечно, объявили синус от строки, но в глобальном пространстве имен. А вызываем
std::sin из пространства имен std, и там такого синуса, очевидно, нет.Но давайте поменяем местами объявление синуса и заголовок
cmath. (можем считать, что у нас есть какой-то локальный заголовок, куда такое объявление просочилось)
#include <iostream>
double sin(std::string x) { return 1.5; }
#include <cmath>
int main() {
std::cout << "string: " << std::sin(std::string{"0.5"}) << std::endl;
}
Угадайте что? Правильно: скомпилируется!
Program returned: 0
string: 1.5
А все почему? Правильно, потому что в заголовке cmath (во многих реализациях на linux) есть вот такая строчка:
using ::sin;
Будьте осторожны. Она там такая не одна.
Telegram
this->notes.
#cpp
Ещё есть такой коллега у меня Паша Сухов. Ну как коллега. Он в Доставке вообще работает, но ведь это всё ещё Яндекс. Так что коллега.
Пашу вы могли видеть на C++ Russia:
- Полезные трюки С++ на примере организации пайплайна
- Как заставить шаблоны…
Ещё есть такой коллега у меня Паша Сухов. Ну как коллега. Он в Доставке вообще работает, но ведь это всё ещё Яндекс. Так что коллега.
Пашу вы могли видеть на C++ Russia:
- Полезные трюки С++ на примере организации пайплайна
- Как заставить шаблоны…
😱5🤯3🔥2👍1
Возвращаемся к нашему военному синусу.
Любимый пример, связанный с ним, после которого хочется переехать в комнату с мягкими стенами.
Эта программа нормально скомпилируется, на всех компиляторах, включая icc.
И выводит ожидаемые
Да, мы объявили какой-то синус в глобальном неймспейсе, который выдает какую-то дичь. Но мы вызываем синусы из стандартной библиотеки, значит все должно быть хорошо.
Ну да ладно, давайте ничего не заменим, только закомментируем последнюю строчку.
Что поменяется? Внезапно, поменяется поведение функции в предыдущей строки.
Как так? Почему эта строчка повлияет на поведение предыдущей? А вот, особенности порядка применения оптимизаций icc.
Добро пожаловать к нам в дурку.
Любимый пример, связанный с ним, после которого хочется переехать в комнату с мягкими стенами.
#include <iostream>
#include <cmath>
double
__attribute((weak))
sin(double x) { return 1.5; }
int main() {
std::cout << "double: " << std::sin(double(0.5)) << std::endl;
std::cout << "integer: " << std::sin(int(0)) << std::endl;
}
Эта программа нормально скомпилируется, на всех компиляторах, включая icc.
И выводит ожидаемые
Program returned: 0
double: 0.479426
integer: 0
Да, мы объявили какой-то синус в глобальном неймспейсе, который выдает какую-то дичь. Но мы вызываем синусы из стандартной библиотеки, значит все должно быть хорошо.
Ну да ладно, давайте ничего не заменим, только закомментируем последнюю строчку.
#include <iostream>
#include <cmath>
double
__attribute((weak))
sin(double x) { return 1.5; }
int main() {
std::cout << "double: " << std::sin(double(0.5)) << std::endl;
// std::cout << "integer: " << std::sin(int(0)) << std::endl;
}
Что поменяется? Внезапно, поменяется поведение функции в предыдущей строки.
Program returned: 0
double: 1.5
Как так? Почему эта строчка повлияет на поведение предыдущей? А вот, особенности порядка применения оптимизаций icc.
Добро пожаловать к нам в дурку.
Telegram
this->notes.
#cpp
Ещё есть такой коллега у меня Паша Сухов. Ну как коллега. Он в Доставке вообще работает, но ведь это всё ещё Яндекс. Так что коллега.
Пашу вы могли видеть на C++ Russia:
- Полезные трюки С++ на примере организации пайплайна
- Как заставить шаблоны…
Ещё есть такой коллега у меня Паша Сухов. Ну как коллега. Он в Доставке вообще работает, но ведь это всё ещё Яндекс. Так что коллега.
Пашу вы могли видеть на C++ Russia:
- Полезные трюки С++ на примере организации пайплайна
- Как заставить шаблоны…
😁9🔥5🤬3❤1
