[c++] есть ли компилятор поддерживающий стандарт?

pitrik2

википедия говорит что стандарт с++ существует: http://en.wikipedia.org/wiki/ISO/IEC_14882#Language_standard
мне вот стало интересно 2 вопроса
1) есть ли компилятор полностью поддерживающий стандарт?
2) есть ли компилятор полностью поддерживающий основные вещи стандарта? (ну тойсть например какиенить ключевые слова/конструкции не поддерживает но если чтото поддерживает то поддерживает это твердо со всякими каверзными случаями)

Serab

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

okis

В большинстве компиляторов проблемы с реализацией export для шаблонов.

Serab

Кстати, export удаляют из стандарта '10, что странно, Страуструп настаивал, что хотя его и мало кто реализует, он должен быть в стандарте, для "фэн шуя".

pitrik2

тойсть на первый вопрос я так понимаю ответ отрицательный
а на второй?

procenkotanya

а на второй?
Comeau C++
EDG (front-end, используется в нескольких компиляторах, в том числе Intel, Nvidia (CUDA Borland)

agent007new

Если из стандарта возьмешь хотя бы ключевое слово export для шаблонов, то круг компиляторов сузится до одного, о котором тут мало кто и слышал, наверное. А если и слышал, то только как раз из-за этого факта(как я).
Если ты это узнал из книжки Саттера, то там еще упоминается пример, который ни один компилятор не смог осилить. С небольшими изменениями студийный осилил

Serab

Если ты это узнал из книжки Саттера, то там еще упоминается пример
а если нет? :)

agent007new

а если нет?
То значит, такой пример там вряд ли упоминается

procenkotanya

>>> Если ты это узнал из книжки Саттера, то там еще упоминается пример [...]
>> а если нет?
> То значит, такой пример там вряд ли упоминается
От того, читал ли Саттера зависит, есть ли в его книге некоторый пример? Мощно.

Andbar

Кстати, коль уж про стандарт заговорили, есть следующий вопрос:
C.2.2.3
The macro NULL, defined in any of <clocale>, <cstddef>, <cstdio>, <cstdlib>, <cstring>,
<ctime>, or <cwchar>, is an implementation-defined C + + null pointer constant in this International
Standard (18.1).
Т.е., NULL - это нулевой указатель. Однако в заголовках студии и гцц для C++ он определяется просто как 0 и typeof(NULL).name равно "int". Я догадываюсь, что так сделали не зря, но при этом, если идёт сборка под x64, размер NULL не соответствует размеру указателя. Это баг или я как-то не правильно понимаю правила?

okis

размер NULL соответствует размеру int. В данном случае. А размер int в msvc (и 32-бит и 64) — 4 байта.
я данную запись понимаю, как "NULL — эквивалент нулевого указателя". Но конкретный нулевой указатель имеет свой тип. Если мы напишем

int* x = NULL; // 0

то всё будет ок, а если, например, так

int* y = NULL; // (void*)0

то будет ошибка.

Serab

то будет ошибка.
так не будет же нигде тут ошибки :)

procenkotanya

под линуксом нормально, NULL длинный

[05:44] 2:~$ echo -e '#include <cstdlib>\nint a[sizeof(NULL)-9];' |g++ -S -xc++ -std=c++98 -
<stdin>:2: error: overflow in array dimension
[05:44] 2:~$ echo -e '#include <cstdlib>\nint a[sizeof(NULL)-5];' |g++ -S -xc++ -std=c++98 -
[05:44] 2:~$

okis

так не будет же нигде тут ошибки

D:\work>cl /EHsc test.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.21003.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

test.cpp
test.cpp(5) : error C2440: 'initializing' : cannot convert from 'void *' to 'int *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast

D:\work>type test.cpp
#define X (void*) 0

int main
{
int* x = X;
return 0;
}

Serab

ок, мне почему-то показалось, что у ты имеешь в виду, что вообще 0 нельзя присвоить int* (т.е. что у тебя в первом примере написано void* X = NULL;

Andbar

гм... Препроцессор выдаёт не 0, а __null.
Нашёл соответствующий дефайн в libio.h:
# if defined __GNUG__ && \
(__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8
# define NULL (__null)
# else
.....
Но в некоторых других заголовках такого дефайна нет, соответственно возможно что в некоторых случаях NULL будет определён как 0.

Serab

возможно
так что ж ты не проверил? или хотя бы напиши, какие хедеры включить, где по-твоему нет дефайна на __null

Andbar

воспроизвелось не у меня, но попробую выяснить.
Сейчас поставлю 64хбитный компилятор от студии и посмотрю, что там с заголовками....
Кстати, кто-то может скомпилить 64хбитным CL и посмотреть, что выводит эта программа?
#include<stdlib.h>
int main
{
int i = -1;
printf("%p %i", NULL, i);
}

Serab

что-то я не понял. Ты же отвечал 'у. Он писал про линукс. Ты написал, что нашел в хедере дефайн на __null, а в некоторых других (из списка?) не нашел. Так вот я всего лишь и попросил написать, в каких, хотел прогнать через cpp из любопытства.
Ладно, сейчас сам попробую.

Serab

# if defined __GNUG__ && \
   (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8
# define NULL (__null)
# else
.....
кстати, зачем то, что за многоточием, пропустил? :)

#ifndef NULL
# if defined __GNUG__ && \
(__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8
# define NULL (__null)
# else
# if !defined(__cplusplus)
# define NULL void*)0)
# else
# define NULL (0)
# endif
# endif
#endif

okis

Могу скомпилить, посмотреть не могу.
http://.su/tmp/test.exe
на самом деле, скомпилить тоже не могу, в исходном виде не компилируется, но это детали

Serab

странно,

$ cat /usr/include/linux/stddef.h
#ifndef _LINUX_STDDEF_H
#define _LINUX_STDDEF_H



#undef NULL // <<<<< what the heck?
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL void *)0)
#endif


#endif

upd. Ну, в принципе, в gcc-специфичном stddef все нормально.

Andbar

Могу скомпилить, посмотреть не могу.
Попробуй либо с /Fa, либо с /E.
Второе даже лучше: если при вызове printf вместо NULL - 0, то баг должен проявиться, по идее.

Andbar

гм...
 
int main
{
int i = -1;
printf("%p %i", 0, i);
}
	mov	r8d, DWORD PTR i$[rsp]
xor edx, edx
lea rcx, OFFSET FLAT:$SG4892
call printf

Тоже самое показал ida (я его не сразу догадался применить). Короче, он, похоже, считает, что NULL 32битный и если в старших разрядах rdx что-то будет, оно выведется.
p.s.: спасибо за компиляцию. У меня почему-то (возможно, из-за установки sp1) отказывается инсталлятор студии работать.

okis

У меня почему-то (возможно, из-за установки sp1) отказывается инсталлятор студии работать.
а как отказывается? можно же компиляторы отдельно вытащить, без инсталлятора.

Serab

http://www.velocityreviews.com/forums/t492580-sizeof-int-on-...
вот, там чувак заявляет, что имел с этим проблемы и что в студии действительно 0, а даже не 0LL

okis


Stop it, you're creeping me out…
:grin:
вот с varargs действительно проблема, не уразумел.

Andbar

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

bleyman

Плюсы прикооольные.
Небось сделать #define NULL 0LL они тоже не могут, потому что перестанет компилиться туча легаси кода. #define NULL void*)0) не могут потому что это плюсы, так что остаётся просто ноль, который нельзя передавать в принтф (впрочем, нафиг кому-то передавать в принтф литеральный NULL — непонятно).

procenkotanya

Если из стандарта возьмешь хотя бы ключевое слово export для шаблонов, то круг компиляторов сузится до одного
Кстати, хе-хе, какой компилятор ты здесь имел в виду?
На самом деле, оказывается, Comeau C++ основан на фронт-енде EDG, который поддерживает export templates. А как я уже писал, на EDG основано несколько других компиляторов, и поэтому все они, теоретически, могут поддерживать export templates. ICC 7.x, например, поддерживал, но это не было документировано.
Другое дело, что в этой реализации могут быть трудноустранимые баги, о которых мне неведомо, и поэтому все компиляторы отключают эту фичу.

Serab

Ну да, Comeau и имел.
На самом деле я прочитал у Саттера и сам в вопросе детально не разбирался, поэтому не знаю всех этих компиляторов.

Serab

(впрочем, нафиг кому-то передавать в принтф литеральный NULL — непонятно).
Не только же принтф есть :grin:
Хотя это плюсы и тем, кто там затеет что-нибудь наподобие принтфа, только собственноручно написанное, можно только пожелать этих проблем и мучительной смерти, да.

Marinavo_0507

>
нафиг кому-то передавать в принтф литеральный NULL
может быть какой-нибудь макрос, который иногда NULL, а иногда что-то полезное
Оставить комментарий
Имя или ник:
Комментарий: