Делает “станд.:: size_t” имеют смысл в C++?

ИЛИ сделайте это с помощью jQuery и CSS!

$('input.disabled').attr('ignore','true').css({
    'pointer-events':'none',
     'color': 'gray'
});

Таким образом, вы отключите элемент, и никакие события указателя не будут срабатывать, но он позволяет распространять, и если они отправлены, вы можете использовать атрибут «игнорировать» ', чтобы игнорировать его.

58
задан jwfearn 28 October 2008 в 01:24
поделиться

8 ответов

Кажется, существует беспорядок среди толпы stackoverflow относительно этого

::size_t, определяется в заголовке обратной совместимости stddef.h. Это была часть ANSI/ISO C и ISO C++ с их самого начала. Каждая реализация C++ должна поставляться с stddef.h (совместимость) и cstddef, где только последний определяет std::size_t и не обязательно ::size_t. См. Приложение D Стандарта C++.

129
ответ дан Johannes Schaub - litb 7 November 2019 в 15:05
поделиться

size_t не встроен в C++. И это не определяется по умолчанию. Этот не компилирует с GCC:

int main(int argc, char** argv) {
size_t size;
}

Однако size_t является частью POSIX и если Вы будете использовать только основные вещи как <cstdlib>, Вы, вероятно, закончите тем, что определили его.

Вы могли утверждать что станд.:: size_t является C++, эквивалентным из size_t. Поскольку Brian указал, станд.:: используется в качестве пространства имен, чтобы не устанавливать глобальные переменные, которые не соответствуют всем. Это точно так же, как станд.:: строка, которая, возможно, также была определена в корневом пространстве имен.

4
ответ дан ypnos 7 November 2019 в 15:05
поделиться

Можно добраться size_t в глобальном пространстве имен включением, например, <stddef.h> вместо <cstddef>. Я не вижу очевидного преимущества, и функция удерживается от использования.

13
ответ дан fizzer 7 November 2019 в 15:05
поделиться

Иногда другие библиотеки будут определять свой собственный size_t. Например, повышение. станд.:: size_t определяет определенное желание C++ стандартный.

size_t является типом стандарта C++, и он определяется в станд. пространства имен

2
ответ дан Brian R. Bondy 7 November 2019 в 15:05
поделиться

Разделите 17.4.1.2 из стандарта C++, абзаца 4, указывает что:

"В Библиотеке Стандарта C++, однако, объявления и определения (за исключением имен, которые определяются как макросы в C) в объеме пространства имен (3.3.5) из станд. пространства имен",

Это включает объекты, найденные в заголовки шаблона cname, включая cstddef, который определяет size_t.

Так станд.:: size_t на самом деле корректен.

41
ответ дан Don Wakefield 7 November 2019 в 15:05
поделиться

The GNU compiler headers contain something like

typedef long int __PTRDIFF_TYPE__;
typedef unsigned long int __SIZE_TYPE__;

Then stddef.h constains something like

typedef __PTRDIFF_TYPE__ ptrdiff_t;
typedef __SIZE_TYPE__ size_t;

And finally the cstddef file contains something like

#include <stddef.h>

namespace std {

  using ::ptrdiff_t;
  using ::size_t;

}

I think that should make it clear. As long as you include you can use either size_t or std::size_t because size_t was typedefed outside the std namespace and was then included. Effectively you have

typedef long int ptrdiff_t;
typedef unsigned long int size_t;

namespace std {

  using ::ptrdiff_t;
  using ::size_t;

}
2
ответ дан Martin 24 November 2019 в 18:38
поделиться

Я думаю, что разъяснения достаточно ясны. std :: size_t имеет смысл в C ++, а :: size_t имеет смысл (по крайней мере) в C.

Однако остается вопрос. А именно, можно ли предположить, что :: size_t и std :: size_t совместимы?

С точки зрения безопасности типов они не обязательно идентичны, если где-то не определено, что они должны быть идентичны.

Я думаю, многие используют что-то а-ля:

----
// a.hpp 
#include <string>

void Foo( const std::string & name, size_t value );

-----
// a.cpp
#include "a.hpp"

using namespace std;

void Foo( const string & name, size_t value ) 
{
  ...
}

Итак, в заголовке вы определенно используете :: size_t , а в исходном файле вы используете std :: size_t . Значит, они должны быть совместимы, верно? В противном случае вы получите ошибку компилятора.

/ Майкл С.

2
ответ дан 24 November 2019 в 18:38
поделиться
std::size_t n = sizeof( long );

На самом деле, вы не спросили, что конкретно кажется плохой практикой в ​​приведенном выше. Использование size_t, квалификация с пространством имен std, ...

Как сказано в стандарте C ++ (18.1), size_t - это тип, определенный в стандартном заголовке. Предлагаю отбросить любые мысли и впечатления о возможном наследовании от языка C. C ++ - это отдельный и другой язык, и его лучше рассматривать как таковой. Он имеет собственную стандартную библиотеку, и все элементы стандартной библиотеки C ++ определены в пространстве имен std. Тем не менее, в программе на C ++ можно использовать элементы стандартной библиотеки C.

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

size_t не является встроенным типом в C ++. Это тип, определенный для указания того, какой тип интегрального типа используется в качестве типа возвращаемого значения оператора sizeof (), поскольку фактический тип возвращаемого значения sizeof () определяется реализацией, поэтому стандарт C ++ унифицирует, определяя size_t.

следующая программа (без включает) ожидается компиляция на все компиляторы C ++?

 size_t foo ()
{
 вернуть sizeof (длинный);
}

Стандарт C ++ говорит (1.4):

Имена, определенные в библиотеке, имеют область пространства имен (7.3). Модуль трансляции AC ++ (2.1) получает доступ к этим именам, включая соответствующий заголовок стандартной библиотеки (16.2).

size_t - это имя, определенное в пространстве имен std, поэтому каждая программа, использующая это имя, должна включать соответствующий заголовок в в этом случае.

Затем в главе 3.7.3 говорится:

Однако ссылки на std, std :: bad_alloc и std :: size_t неправильно сформированы, если имя не было объявлено с включением соответствующего заголовка.

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

4
ответ дан 24 November 2019 в 18:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: