LINUX.ORG.RU

Поломана совместимость с С в С++11?

 


2

2
cat test.cpp 
#include <stdio.h>

int main(int argc, char** argv)
{
	auto int i = 2;
	printf("Hello!\n");
	return 0;
}
 gcc test.cpp.
/a.out
Hello!
 g++ test.cpp
 ./a.out 
Hello!
 g++ --std=c++11 test.cpp 
test.cpp: В функции «int main(int, char**)»:
test.cpp:5:11: ошибка: два или более типа в декларации имени «i»

Ваши мнения по этому поводу.

Ответ на: комментарий от x0r

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

Dron ★★★★★
()
Ответ на: комментарий от Dron

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

x0r ★★★★★
()

Совместимость была сломана гораздо раньше

int *new = 0;
void class()
{}
Deleted
()
Ответ на: комментарий от x0r

примеры в студию.

http://rghost.ru/43110448

а надо о синхронизации

От части да ты прав но если можно просто явно указать чтобы просчитал-записал память, просчитал-записал в память, то я выберу такой путь вместо заведения буферов и прочего, хотя далеко не всегда это прокатит.

Dron ★★★★★
()
Ответ на: комментарий от x0r

Есть, но если туда ничего не будет проецироваться то толку не будет, я про то и говорил что если не указать явно как должно работать будет работать но не так как нам надо, я лишь частный случай применения volatile который и устраняет гемор.Чисто для примера. Задачи разные и разные пути решения.

Dron ★★★★★
()
Ответ на: комментарий от Dron

http://rghost.ru/43110448

и что тут плохого? 4.2, вот выхлоп gcc:

int func()
{
    int a = 3;
    int b = 9;
    int c = a + b;
    a = b + 1;
    int d = a + c;
    return d;
}
_Z4funcv:
.LFB968:
    .file 1 "main.cpp"
    .loc 1 4 0
    .cfi_startproc
    pushq   %rbp
.LCFI0:
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
.LCFI1:
    .cfi_def_cfa_register 6
.LBB2:
    .loc 1 5 0
    movl    $3, -4(%rbp)
    .loc 1 6 0
    movl    $9, -8(%rbp)
    .loc 1 7 0
    movl    -8(%rbp), %eax
    movl    -4(%rbp), %edx
    addl    %edx, %eax
    movl    %eax, -12(%rbp)
    .loc 1 8 0
    movl    -8(%rbp), %eax
    addl    $1, %eax
    movl    %eax, -4(%rbp)
    .loc 1 9 0
    movl    -12(%rbp), %eax
    movl    -4(%rbp), %edx
    addl    %edx, %eax
    movl    %eax, -16(%rbp)
    .loc 1 10 0
    movl    -16(%rbp), %eax
.LBE2:
    .loc 1 11 0
    popq    %rbp
.LCFI2:
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc

явно указать чтобы просчитал-записал память, просчитал-записал в память

то я выберу такой путь вместо заведения буферов

чтото я не уловилв чем разница? malloc(sizeof(int)) вот тебе и облать памяти под буфер.

x0r ★★★★★
()
Ответ на: комментарий от x0r

не знаю, как он, а я вот периодически умнее компилятора (ну или его разработчиков), и приходится писать багрепорты.

anonymous
()

C++ не надмножество C. Ты не знал?

KblCb ★★★★★
()

auto int i = 2;

Может просто

auto i = 2;

или

int i = 2;

andreyu ★★★★★
()
Ответ на: комментарий от Dron

А будет то что она будет помещена в регистр и не будет проецироватся в оперативную память до окончания цикла, поэтому второй поток вместо того чтобы считать много раз будет бесконечно крутится в пустую ничего не считая.

Ну естественно чуда не случится и думать по прежнему надо. А вообще кто мешает, если сильно хочется, написать так:

volatile auto a = 10;
?

(Кстати, моё мнение, что в простых случаях авто нафиг не нужно, но оно бывает полезно. Облявлять так все переменные никто не заставляет.)

DarkEld3r ★★★★★
()

Этот же auto C++11 по-моему потом ему в минусы запишут люди с текстовыми редакторами вместо IDE. Если его не только для итераторов использовать это ж по чужому коду вдвое больше бегать придется, чтобы return type проверить. С++ такой сложный, ковай! И так некоторые ругаются на перегрузку операторов.

libdotnet
()
Ответ на: комментарий от anonymous

Чушь и безграмотная брехня. Auto в C очень даже нужен. В сочетании с макросами позволяет делать то, что в C++ делают на темплейтах.

Я проверял, сделал поддержку auto для C в Clang-е.

anonymous
()
Ответ на: комментарий от anonymous

В сочетании с макросами позволяет делать то, что в C++ делают на темплейтах.

Изготовление троллейбусов из буханок хлеба - традиционный промысел программистов.

imtw
()
Ответ на: комментарий от svu

Плюсы не навязывают ничего из своих возможностей, причем если вы ту или иную возможность не используете, то ее наличие в языке никак не сказывается на вашем коде и его производительности. Зачем собирать код сишным компилятором, а не плюсовым? Что, кроме религии, вам мешает?

anonymous
()
Ответ на: комментарий от Dron

в си просто при записи auto int спецификатор auto игнорируется

не игнорируется. Он просто обычно совпадает с дефолтом. Это, кстати, нормальная практика в C, например int тоже, как ты говоришь «игнорируется», можно (было) писать main(){return 0;}, без всякого int. Переменные тоже можно описывать любым ключевым словом, типа signed x;

а в с++ нет

в c++11 ему совершенно НОВОЕ значение придумали.

drBatty ★★
()
Ответ на: комментарий от anonymous

или тривиально исправляется :) Если, конечно, это название функции, да ещё экспортируемой, тогда ой. А переменную переименовать делов немного.

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

Дураки, что еще сказать можно.

anonymous
()
Ответ на: комментарий от anonymous

Покажи такое использование auto(именно в старом сишном смысле) в макросах, о котором ты говоришь. Как оно помогает делать то, что в С++ делается на темплейтах?

anonymous
()
Ответ на: комментарий от anonymous

А, круто. А в общедоступ ты свою перделку не выкладывал, случаем? И насколько корректно она работает со структурами/объединениями/перечислениями?

anonymous
()
Ответ на: комментарий от Dron

А будет то что она будет помещена в регистр и не будет проецироватся в оперативную память

а кто тебе сказал, что стек проецируется в память?

drBatty ★★
()
Ответ на: комментарий от anonymous

Не выкладывал, но там вообще тривиально делается, патч на 30 строк с контекстом (тупо, убрать if (getLangOpts().CPlusPlus ) ...). Работает точно так же, как в C++, все корректно.

anonymous
()
Ответ на: комментарий от drBatty

О, дебилко продолжает жечь про особый статус стека перед остальной памятью. Ты уже обосрался недавно на эту тему, хочешь снова себя клиническим идиотом выставить, да?

anonymous
()
Ответ на: комментарий от x0r

int a = 3; int b = 9;

с разморозкой. a и b это КОНСТАНТЫ. они не то-что в стек не попадают, а вообще в код. Например a+b это для компилятора просто 12.

drBatty ★★
()
Ответ на: комментарий от Reset

Он о том, что плюсовый auto был бы неплох и в чистом С.

anonymous
()
Ответ на: комментарий от Reset

А на кой хрен плюсовый auto скрещивать с макросами? Вообще за такое надо по рукам бить.

Бить надо тебя, по голове. За систематическую тупость, и за отсутствие воображения.

anonymous
()
Ответ на: комментарий от unsigned

А typeof тебе не хватило?

Нет, так очень некрасивый код получается.

Кроме того, макросы - это так, не самый интересный частный случай. Намного больше пользы от auto для более сложного метапрограммирования, для кода, сгенеренного препроцессором или вообще компилятором DSL. При его наличии можно существенно упростить или вообще убрать типизацию из самого компилятора DSL.

anonymous
()
Ответ на: комментарий от x0r

ассемблер в том же посте глянь

видел. Это не пруф (не)нужности auto. Даже с O1 твой код сворачивается в

00000000004005c0 <main>:
  4005c0:       b8 16 00 00 00          mov    eax,0x16
  4005c5:       c3                      ret    
а без оптимизации, да, у меня вышло
00000000004005c0 <main>:
  4005c0:       55                      push   rbp
  4005c1:       48 89 e5                mov    rbp,rsp
  4005c4:       c7 45 fc 03 00 00 00    mov    DWORD PTR [rbp-0x4],0x3
  4005cb:       c7 45 f8 09 00 00 00    mov    DWORD PTR [rbp-0x8],0x9
  4005d2:       8b 45 f8                mov    eax,DWORD PTR [rbp-0x8]
  4005d5:       8b 55 fc                mov    edx,DWORD PTR [rbp-0x4]
  4005d8:       01 d0                   add    eax,edx
  4005da:       89 45 f4                mov    DWORD PTR [rbp-0xc],eax
  4005dd:       8b 45 f8                mov    eax,DWORD PTR [rbp-0x8]
  4005e0:       83 c0 01                add    eax,0x1
  4005e3:       89 45 fc                mov    DWORD PTR [rbp-0x4],eax
  4005e6:       8b 45 f4                mov    eax,DWORD PTR [rbp-0xc]
  4005e9:       8b 55 fc                mov    edx,DWORD PTR [rbp-0x4]
  4005ec:       01 d0                   add    eax,edx
  4005ee:       89 45 f0                mov    DWORD PTR [rbp-0x10],eax
  4005f1:       8b 45 f0                mov    eax,DWORD PTR [rbp-0x10]
  4005f4:       5d                      pop    rbp
  4005f5:       c3                      ret    
 
Но такие примитивные оптимизации ещё во времена K&R существовали.

drBatty ★★
()
Ответ на: комментарий от drBatty

это не пруф оптимизации, тред почитай. там мне пытались втереть, что современные трансляторы сходу оптимизируют код. я привел пример для gcc, который какбы намекает на 4.2.

x0r ★★★★★
()
Ответ на: комментарий от x0r

там мне пытались втереть, что современные трансляторы сходу оптимизируют код. я привел пример для gcc, который какбы намекает на 4.2.

они и оптимизируют. Мало кто компиллит IRL с -O0. Я вообще-то не представляю, зачем это вообще надо, кроме тестов.

drBatty ★★
()
Ответ на: комментарий от drBatty

Я вообще-то не представляю, зачем это вообще надо, кроме тестов.

Для отладки (и много реже - поиска бага в компиляторе).

К.О.

LamerOk ★★★★★
()

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

anonymous
()
Ответ на: комментарий от anonymous

Затем, что С не является подмножеством плюсов. Есть сишный код, несобираемый плюсовым компилятором. Не говоря уж о той мелочи, что плюсовый тормознее и тяжелее по определению, в силу сложности языка плюсов. Так что вопрос в другом - нафига собирать сишный код плюсовым комилятором?

svu ★★★★★
()
Ответ на: комментарий от anonymous

Это половина гадости. Вторая половина - своя, родная, плюсовая. И главная гадость - это именно смесь.

svu ★★★★★
()
Ответ на: комментарий от anonymous

Нафиг не сдалось адаптировать сишный код под плюсы. Абсолютно бессмысленная трата времени и сил.

svu ★★★★★
()
Ответ на: комментарий от svu

Чтобы не херачить костыли в виде префиксов(вместо неймспейсов), идиотские нечитаемые макросы(вместо шаблонов), тормозные костыли для ООП(вместо нормальной поддержки и оптимизаций компилятора) и т.д. и т.п.

«Тяжелый» рантайм там только для исключения и RTTI и оба они отключаются ключами компиляторов.

Каким бы плохим не был С++, он лучше С. И пока не допилят Rust(если допилят и не успеют испортить), он будет лучшим в этой нише.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.