系统头文件/usr/include/i386_types.h中的错误

Mic*_*eed 2 c++ macos

我已经使用C/C++大约7个月了,目前我正在尝试编写一小组线性代数程序.现在我正在尝试测试我的vector类,但是收到错误消息:

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’
Run Code Online (Sandbox Code Playgroud)

在/usr/include/c++/4.2.1/stdexcept:43中包含的文件中,来自vector.cpp:8:/usr/include/c++/4.2.1/exception:40:错误:'#pragma'不允许这里

shell returned 1
Run Code Online (Sandbox Code Playgroud)

我正在运行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;
}
Run Code Online (Sandbox Code Playgroud)

来自_types.h的违规行(37)是:

#ifdef __GNUC__
typedef __signed char      __int8_t;  // L37
#else /* !__GNUC__ */
typedef char               __int8_t;
Run Code Online (Sandbox Code Playgroud)

从例外(40):

#ifndef __EXCEPTION__
#define __EXCEPTION__

#pragma GCC visibility push(default)  // L40

#include <bits/c++config.h>
Run Code Online (Sandbox Code Playgroud)

我在谷歌上做了一些搜索,看到了涉及类似错误类型的事情,但它通常是用户代码中语法错误的结果.我也在我大学计算机实验室的机器上看到了这个确切的错误.他们在ubuntu lucid上运行gcc/g ++ - 4.2.4.我在mac os x 10.6.5上运行gcc/g ++ - 4.2.1.

Gre*_*ill 5

通常在C++中包含的系统头文件(S),你需要,其次是你的应用程序的头文件.尝试重新排序包含,看看是否有帮助:

vector.cpp

#include <cstdlib>
#include <cmath>

#include "linalg.h"
Run Code Online (Sandbox Code Playgroud)

例外情况是当您包含与当前模块对应的头文件时:

linalg.cpp

#include "linalg.h"

#include <cmath>
// etc

#include "utils.h" // or whatever
Run Code Online (Sandbox Code Playgroud)

如果你这样做,它将确保你的linalg.h标题可以包含在任何地方,它总是包含它自己需要的东西,而不是依靠用户首先包含系统的东西.