size_t не может быть найден g ++ - 4.1 или другими в Ubuntu 8.1 - PullRequest
10 голосов
/ 10 июля 2009

Это уже случалось со мной, но я не могу вспомнить, как я это исправил.

Я не могу скомпилировать некоторые программы здесь при новой установке Ubuntu ... Что-то не так с моими заголовками.

Я пробовал g ++ - 4.1 и 4.3, но безрезультатно.

g++ -g -frepo  -DIZ_LINUX -I/usr/include/linux -I/usr/include -I/include  -c qlisttest.cpp
/usr/include/libio.h:332: error: ‘size_t’ does not name a type
/usr/include/libio.h:336: error: ‘size_t’ was not declared in this scope
/usr/include/libio.h:364: error: ‘size_t’ has not been declared
/usr/include/libio.h:373: error: ‘size_t’ has not been declared
/usr/include/libio.h:493: error: ‘size_t’ does not name a type
/usr/include/stdio.h:294: error: ‘size_t’ has not been declared
...

файл ...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
...



@ubuntu:~/work/zpk/src$ cat /usr/include/linux/types.h | grep size_t
typedef __kernel_size_t    size_t;
typedef __kernel_ssize_t   ssize_t;

types.h определенно находится на пути, и его подбирают. Я проверил, изменив имя файла, и получил сообщение об ошибке ...

У кого-нибудь есть идеи ...? Буду очень признателен за помощь ...

Ответы [ 6 ]

9 голосов
/ 10 июля 2009

Начните с удаления -I / usr / include / linux и -I / usr / include. Добавление системных каталогов для включения путей вручную либо не имеет никакого эффекта, либо нарушает работу. Кроме того, удалите -frepo для дополнительной безопасности.

4 голосов
/ 10 июля 2009

Как правило, вы не должны использовать C .h файлы для C ++. Хотя вы можете найти простой способ обойтись без него, и хотя многое из этого было разрешено в предыдущих версиях g ++ и в других компиляторах, стандарт C ++ определяет size_t в cstddef (см. Раздел 18.2 / таблица 17). g ++ становится все более строгим.

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

#include <cstddef>
using namespace std;
4 голосов
/ 10 июля 2009

Трудно сказать, в чем проблема, не видя вашего полного источника. Лучший способ отладить подобные проблемы - использовать параметр «-E» в g ++ для получения вывода перед процессором, а затем посмотреть на него, чтобы выяснить, что происходит в ваших включениях. Вот что страница g ++ info говорит о "-E":

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

Кроме того, почему бы просто не включить sys / types.h вверху файла?

Добавление:

В моей системе я создал короткий файл с именем foo.cc, который содержит только:

#include <time.h>

А потом я побежал:

g ++ -E /tmp/foo.cc> /tmp/foo.pp

Очень детально смотреть на этот вывод. Например, я узнал, что /usr/include/bits/types.h имеет typedef для __time_t, и что /usr/include/types.h затем использует этот typedef, чтобы сказать «typedef __time_t time_t». Но есть и другие интересные макросы, окружающие это определение. Обратите особое внимание на такие вещи, как макрос "__BEGIN_NAMESPACE_STD" в /usr/include/time.h, который в моей системе кажется пустым определением. Но я могу себе представить, что некоторые другие системы могут иметь другое значение для этого макроса, заставляя определение time_t в каком-то другом пространстве имен.

Прочитайте информационную страницу Cpp, раздел «9 Вывод препроцессора», который определяет формат строк файла. Особого внимания заслуживает раздел:

Имя исходного файла и информация о номере строки передаются в строках вида

# ФЛАГИ ФИЛЬМА ИМЕНИ

А затем продолжаем описывать «ФЛАГИ», которые представляют интерес для этого уровня отладки.

3 голосов
/ 18 июля 2009

Забыл следить за этим. Оказывается, что /usr/include нельзя включить с /usr/include/linux в этом конкретном дистрибутиве. size_t, похоже, уничтожается вторым включением.

Мои включения теперь просто /usr/include, и они прекрасно работают.

-I/usr/include -I/usr/include/ace -I/usr/lib/glib-2.0/include -I/usr/include/glib-2.0...

Вытащил все включения и поиграл с ними, исправил.

3 голосов
/ 10 июля 2009

Вы установили пакет build-essential?

sudo apt-get install build-essential
1 голос
/ 10 июля 2009

Должен быть в stddef.h или cstddef. types.h не является стандартной библиотекой, и я считаю, что она относится к типам, которые нужны ОС.

...