[c++] есть ли компилятор поддерживающий стандарт?
Если из стандарта возьмешь хотя бы ключевое слово export для шаблонов, то круг компиляторов сузится до одного, о котором тут мало кто и слышал, наверное. А если и слышал, то только как раз из-за этого факта(как я).
В большинстве компиляторов проблемы с реализацией export для шаблонов.
Кстати, export удаляют из стандарта '10, что странно, Страуструп настаивал, что хотя его и мало кто реализует, он должен быть в стандарте, для "фэн шуя".
а на второй?
а на второй?Comeau C++
EDG (front-end, используется в нескольких компиляторах, в том числе Intel, Nvidia (CUDA Borland)
Если из стандарта возьмешь хотя бы ключевое слово export для шаблонов, то круг компиляторов сузится до одного, о котором тут мало кто и слышал, наверное. А если и слышал, то только как раз из-за этого факта(как я).Если ты это узнал из книжки Саттера, то там еще упоминается пример, который ни один компилятор не смог осилить. С небольшими изменениями студийный осилил
Если ты это узнал из книжки Саттера, то там еще упоминается примера если нет?
а если нет?То значит, такой пример там вряд ли упоминается
>> а если нет?
> То значит, такой пример там вряд ли упоминается
От того, читал ли Саттера зависит, есть ли в его книге некоторый пример? Мощно.
C.2.2.3Т.е., NULL - это нулевой указатель. Однако в заголовках студии и гцц для C++ он определяется просто как 0 и typeof(NULL).name равно "int". Я догадываюсь, что так сделали не зря, но при этом, если идёт сборка под x64, размер NULL не соответствует размеру указателя. Это баг или я как-то не правильно понимаю правила?
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 — эквивалент нулевого указателя". Но конкретный нулевой указатель имеет свой тип. Если мы напишем
int* x = NULL; // 0
то всё будет ок, а если, например, так
int* y = NULL; // (void*)0
то будет ошибка.
то будет ошибка.так не будет же нигде тут ошибки
[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:~$
так не будет же нигде тут ошибки
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;
}
ок, мне почему-то показалось, что у ты имеешь в виду, что вообще 0 нельзя присвоить int* (т.е. что у тебя в первом примере написано void* X = NULL;
Нашёл соответствующий дефайн в libio.h:
# if defined __GNUG__ && \Но в некоторых других заголовках такого дефайна нет, соответственно возможно что в некоторых случаях NULL будет определён как 0.
(__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8
# define NULL (__null)
# else
.....
возможнотак что ж ты не проверил? или хотя бы напиши, какие хедеры включить, где по-твоему нет дефайна на __null
Кстати, кто-то может скомпилить 64хбитным CL и посмотреть, что выводит эта программа?
#include<stdlib.h>
int main
{
int i = -1;
printf("%p %i", NULL, i);
}
Ладно, сейчас сам попробую.
# 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
http://.su/tmp/test.exe
на самом деле, скомпилить тоже не могу, в исходном виде не компилируется, но это детали
$ 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 все нормально.
Могу скомпилить, посмотреть не могу.Попробуй либо с /Fa, либо с /E.
Второе даже лучше: если при вызове printf вместо NULL - 0, то баг должен проявиться, по идее.
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) отказывается инсталлятор студии работать.
У меня почему-то (возможно, из-за установки sp1) отказывается инсталлятор студии работать.а как отказывается? можно же компиляторы отдельно вытащить, без инсталлятора.
http://www.velocityreviews.com/forums/t492580-sizeof-int-on-...
вот, там чувак заявляет, что имел с этим проблемы и что в студии действительно 0, а даже не 0LL
вот, там чувак заявляет, что имел с этим проблемы и что в студии действительно 0, а даже не 0LL
Stop it, you're creeping me out…
вот с varargs действительно проблема, не уразумел.
а как отказывается? можно же компиляторы отдельно вытащить, без инсталлятора.учитывая то, что у меня под руками нет ничего 64хбитного с виндой, особого смысла качать 64-битный компилятор не вижу. А в дистре, с которого студию ставил, найти отдельные части не получилось.
Небось сделать #define NULL 0LL они тоже не могут, потому что перестанет компилиться туча легаси кода. #define NULL void*)0) не могут потому что это плюсы, так что остаётся просто ноль, который нельзя передавать в принтф (впрочем, нафиг кому-то передавать в принтф литеральный NULL — непонятно).
Если из стандарта возьмешь хотя бы ключевое слово export для шаблонов, то круг компиляторов сузится до одногоКстати, хе-хе, какой компилятор ты здесь имел в виду?
На самом деле, оказывается, Comeau C++ основан на фронт-енде EDG, который поддерживает export templates. А как я уже писал, на EDG основано несколько других компиляторов, и поэтому все они, теоретически, могут поддерживать export templates. ICC 7.x, например, поддерживал, но это не было документировано.
Другое дело, что в этой реализации могут быть трудноустранимые баги, о которых мне неведомо, и поэтому все компиляторы отключают эту фичу.
На самом деле я прочитал у Саттера и сам в вопросе детально не разбирался, поэтому не знаю всех этих компиляторов.
(впрочем, нафиг кому-то передавать в принтф литеральный NULL — непонятно).Не только же принтф есть
Хотя это плюсы и тем, кто там затеет что-нибудь наподобие принтфа, только собственноручно написанное, можно только пожелать этих проблем и мучительной смерти, да.
нафиг кому-то передавать в принтф литеральный NULLможет быть какой-нибудь макрос, который иногда NULL, а иногда что-то полезное
Оставить комментарий
pitrik2
википедия говорит что стандарт с++ существует: http://en.wikipedia.org/wiki/ISO/IEC_14882#Language_standardмне вот стало интересно 2 вопроса
1) есть ли компилятор полностью поддерживающий стандарт?
2) есть ли компилятор полностью поддерживающий основные вещи стандарта? (ну тойсть например какиенить ключевые слова/конструкции не поддерживает но если чтото поддерживает то поддерживает это твердо со всякими каверзными случаями)