2015-09-12 2 views
2

У меня есть код, который я не могу скомпилировать на одном компьютере. Он работает на моем ПК, но по другому он не работает. Ошибка «переопределение typdef CPLX», хотя у меня есть охранник на каждом файле заголовка и у меня есть охранник для каждого определения typdef:Переопределение типа в c, но защита включена?

#ifdef __cplusplus 
#include <complex> 
#include <cmath> 
typedef std::complex<double> cplx; 
#else 
#include <tgmath.h> 
typedef double complex cplx; 
#endif 

Почему происходит это проблемы? Вот два файла заголовка. blas.h:

#ifndef BLAS_H 
#define BLAS_H 
#ifdef __cplusplus 
#include <complex> 
#include <cmath> 
typedef std::complex<double> cplx; 
#else 
#include <tgmath.h> 
typedef double complex cplx; 
#endif 
//declaration of functions 
#endif 

и lapack.h:

#ifndef LAPACK_H 
#define LAPACK_H 
#ifdef __cplusplus 
#include <complex> 
#include <cmath> 
typedef std::complex<double> cplx; 
#else 
#include <tgmath.h> 
typedef double complex cplx; 
#endif 
//declarations of functions 
#endif 

Проблема заключается в том, когда я включаю как, lapack.h и blas.h, я получаю эту ошибку?

+1

Там нет [охранник] (https://en.wikipedia.org/wiki/Include_guard) в данный образец фактически :). – AlexD

+0

Я включил охранников в файлы заголовков. Поэтому каждый заголовочный файл содержит охрану в начале. Кроме того, я включил охранников в определение типа. (например, описанный выше код). – user3616359

+0

@ user3616359 Показать код вашего файла заголовка. –

ответ

3

Ваши охранники защищают один и тот же файл включений, включенный дважды, но у вас есть два разных файла с двумя разными защитными устройствами, и вы определяете cplx в каждом из них.

Вам нужен отдельный караул для этого типа в каждой включают файл, например:

#ifndef CPLX 
#define CPLX 
#ifdef __cplusplus 
#include <complex> 
#include <cmath> 
typedef std::complex<double> cplx; 
#else 
#include <tgmath.h> 
typedef double complex cplx; 
#endif 
//declarations of functions 
#endif