Ошибка в системном заголовочном файле /usr/include/i386_types.h - PullRequest
2 голосов
/ 16 марта 2011

Я использую C / C ++ около 7 месяцев и в настоящее время пытаюсь написать небольшой набор программ линейной алгебры. Сейчас я пытаюсь проверить свой векторный класс, но получаю сообщение об ошибке:

In file included from /usr/include/machine/_types.h:34,
             from /usr/include/sys/_types.h:33,
             from /usr/include/_types.h:27,
             from /usr/include/unistd.h:71,
             from /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/os_defines.h:61,
             from /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++config.h:41,
             from /usr/include/c++/4.2.1/cstdlib:50,
             from linalgtest.cpp:8:
/usr/include/i386/_types.h:37: error: two or more data types in declaration of ‘__int8_t’

В файле, включенном в /usr/include/c++/4.2.1/stdexcept:43, из вектора.cpp: 8: /usr/include/c++/4.2.1/exception:40: ошибка: «#pragma» здесь не разрешена

shell returned 1

Я использую Mac OS X 10.6.5 и проверил мой файл /usr/include/i386_types.h по сравнению с файлом, найденным по адресу http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/i386/_types.h..

Вот содержимое моего файла тестера

#include "linalg.h" // L7
#include <cstdlib> // L8: the offending line
#include <cmath> // L9

using namespace std;

double drand(double d) { return d*((double)rand()/RAND_MAX); }

int main(void) {
   int n = 10;
   double comps[10];
   for (int i = 0; i < n; ++i)
      comps[i] = drand(10.0);

   vector *v1 = new vector(n);
   vector *v2 = new vector(n, comps);
   v1->print();
   v2->print();

   return 0;
}

Вызывающая строка (37) из _types.h:

#ifdef __GNUC__
typedef __signed char      __int8_t;  // L37
#else /* !__GNUC__ */
typedef char               __int8_t;

Из исключения (40):

#ifndef __EXCEPTION__
#define __EXCEPTION__

#pragma GCC visibility push(default)  // L40

#include <bits/c++config.h>

Я провел некоторый поиск в Google и видел вещи, связанные с подобными типами ошибок, но обычно это результат синтаксической ошибки в пользовательском коде. Я также вижу эту ошибку на компьютерах в компьютерной лаборатории моего университета. Они запускают gcc / g ++ - 4.2.4 на Ubuntu Lucid. Я запускаю gcc / g ++ - 4.2.1 на Mac OS X 10.6.5.

1 Ответ

5 голосов
/ 16 марта 2011

Обычно в C ++ вы включаете необходимые файлы системных заголовков сначала , а затем файлы заголовков вашего приложения. Попробуйте изменить порядок включений и посмотрите, поможет ли это:

vector.cpp

#include <cstdlib>
#include <cmath>

#include "linalg.h"

Исключением является случай, когда вы включаете заголовочный файл, который соответствует текущему модулю:

linalg.cpp

#include "linalg.h"

#include <cmath>
// etc

#include "utils.h" // or whatever

Если вы сделаете это, это гарантирует, что ваш заголовок linalg.h может быть включен везде, и он всегда включает в себя то, что ему нужно от себя, вместо того, чтобы полагаться на то, что пользователи сначала включат системные элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...