Почему я не могу выполнить sizeof против статического символа [] другого класса?

Гуру SEO Jim Westergren протестировал этот назад в 2005 со строгой точки зрения SEO и пришел к выводу, что + (плюс) был на самом деле лучший ограничитель слова. Однако это не кажется разумным и может произойти из-за ошибки в алгоритмах поисковых систем. Он рекомендует - (тире) и для удобочитаемости и для SEO.

5
задан Alan 8 December 2009 в 11:10
поделиться

4 ответа

sizeof работает только с полными типами. const char * TEST [] не является полным типом, пока он не определен в First.cpp.

sizeof(char*[10]) == sizeof(char*) * 10 == 40
sizeof(short[10]) == sizeof(short) * 10 == 20

// a class Foo will be declared
class Foo;
sizeof(Foo) == //we don't know yet

// an array bar will be defined.
int bar[];
sizeof(bar) == sizeof(int) * ? == //we don't know yet.

// actually define bar
int bar[/*compiler please fill this in*/] = { 1, 2, 3 };
sizeof(bar) == sizeof(int) * 3 == 12
// note bar is exactly the right size

// an array baz is defined.
int baz[4];
sizeof(baz) == sizeof(int) * 4 == 16

// initialize baz
int baz[4] = { 1, 2, 3 };
sizeof(bar) == sizeof(int) * 4 == 16
// note baz is still 4 big, the compiler doesn't control its size

Чтобы заставить это работать по своему желанию, вы можете:

  • добавить размер массив First :: TEST к его объявлению ( static const char * TEST [2]; )
  • добавить новый статический метод, который возвращает sizeof First :: TEST . Метод не может быть встроенным, он должен быть определен в First.cpp.
8
ответ дан 18 December 2019 в 13:15
поделиться

Для меня даже первый sizeof (TEST) не может быть скомпилирован, поскольку TEST не был объявлен с размером (который разрешается только во время компоновки).

Если я изменю TEST [] , скажем, на TEST [10] , то оба случая будут компилироваться.

Я ожидал оба результата.

Какой вы компилятор? с помощью?

1
ответ дан 18 December 2019 в 13:15
поделиться

Это становится понятнее, когда вы расширяете Second.cpp. Вот и все, что компилируется (1 единица компиляции):

class First
{
public:
    static const char* TEST[];

public:
    First();
};


class Second
{
public:
    Second();

    Second::Second()
    {
       uint32_t len = sizeof(First::TEST); // error
       uint32_t elements = (sizeof(First::TEST) / sizeof(First::TEST[0])); // error
    }
}

Если вы посмотрите сюда, First :: TEST явно не имеет размера, а sizeof (FIRST :: TEST) не имеет смысла.

Почему бы просто не иметь метод, который возвращает длину TEST?

2
ответ дан 18 December 2019 в 13:15
поделиться

Эта функция отсутствовала долгое время - запрос функции был создан в ноябре 1999 года и был окончательно реализован в августе. 2010 (NetBeans 6.10). Вы можете включить / отключить его в « Просмотр → Показать непечатаемые символы ».

История ошибок

В NetBeans 7.0.1 определение «непечатаемых», по-видимому, включает вкладки и возврат каретки, но не обычный символ пробела:

NetBeans 7.0.1

NetBeans 7.1.0 наконец отображает пробелы. Однако теперь в нем есть новая ошибка, при которой последовательные табуляции (или комбинации табуляции и пробелов) сворачиваются в одну вкладку:

NetBeans 7.1.0

NetBeans 7.4.0 исправляет это:

NetBeans 7.4.0

Там '

sizeof () в Second (обычно) разрешается во время компиляции, когда известно только объявление массива, а пространство для статического не было выделено не может быть вычислено. См. http://en.wikipedia.org/wiki/Sizeof#sizeof_and_incomplete_types

3
ответ дан 18 December 2019 в 13:15
поделиться
Другие вопросы по тегам:

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