Переопределенный символ в множественном коде c с директивой #ifndef

У меня глупая проблема, и я не понимаю, откуда она. Я позаботился об использовании директивы #ifndef, чтобы убедиться, что все мои #include не переопределены. К сожалению, для трех из них это происходит. Вот моя арка из нескольких файлов:

t_include.h

#ifndef T_INCLUDE_H_
#define T_INCLUDE_H_

/* Project specific dependencies*/
#include "utilities.h"
#include "fsp_function.h"

#include "ti/csl/csl_tsc.h"
#include "ti/csl/csl_cache.h"
#include "ti/csl/csl_cacheAux.h"

#include "ti_sp_complex_convolution_A_input1.h"
#include "ti_sp_complex_convolution_A_input2.h"
#include "to_sp_complex_convolution_A_output.h"

#endif /* T_INCLUDE_H_ */

t_function.h

#ifndef T_FUNCTION_H_
#define T_FUNCTION_H_

#include "t_include.h"

/*output vector*/
#define INPUT1A_LENGTH  5000
#define INPUT2A_LENGTH  2800
#define OUTPUTA_LENGTH  2202
extern FLOAT32 sp_complex_convolution_A_output_thales[OUTPUTA_LENGTH];

/*misc parameter*/
#define CPU_CLOCK_KHZ           1400000
#define CPU_CLOCK_MS            1/CPU_CLOCK_KHZ
#define FIR_NB_MACS             INPUT1A_LENGTH * OUTPUTA_LENGTH     /*   FIR algorithm complexity */
#define NB_OF_REP               10
#define UMA_L2CACHE_L1DCACHE    0

/* Project specific types */
typedef struct{
ect...

И теперь c файл включает только t_function.h:

t_function.c

/* Dependencies */
#include "t_function.h"
FLOAT32 sp_complex_convolution_A_output_thales[OUTPUTA_LENGTH];
/* API  */
etc...

И t_main_function.c

/* dependencies */
#include "t_function.h"
void main(void) {
etc...

Это должно работать, но во время ссылки здесь появляются ошибки:

<Linking>
error #10056: symbol "sp_complex_convolution_A_output" redefined: first defined in "./TEST/t_function.obj"; redefined in "./TEST/t_main_function.obj"
error #10056: symbol "sp_complex_convolution_A_input2" redefined: first defined in "./TEST/t_function.obj"; redefined in "./TEST/t_main_function.obj"
error #10056: symbol "sp_complex_convolution_A_input1" redefined: first defined in "./TEST/t_function.obj"; redefined in "./TEST/t_main_function.obj"

error #10056: symbol "sp_complex_convolution_A_output_thales" redefined: first defined in "./TEST/t_function.obj"; redefined in "./TEST/t_main_function.obj"
>> Compilation failure
error #10010: errors encountered during linking; "CONVOLUTION_COMPLEX.out" not built

Таким образом, ошибка только com из трех символов sp_complex_convolution_A_output, sp_complex_convolution_A_input1 и sp_complex_convolution_A_input2, которые определены в их собственном.h, который также защищен директивами #ifndef:

ti_sp_complex_convolution_A_input1.h

#ifndef __TI_SP_COMPLEX_CONVOLUTION_A_INPUT1_H_
#define __TI_SP_COMPLEX_CONVOLUTION_A_INPUT1_H_

FLOAT32 sp_complex_convolution_A_input1[2 * 2500] = {
etc... 

И то же самое для двух других...

Так что я действительно не знаю, почему это происходит. Спасибо за помощь

1 ответ

Определения, такие как:

FLOAT32 sp_complex_convolution_A_output_thales[OUTPUTA_LENGTH];

должен перейти в исходный файл.

Заголовочные файлы должны содержать только объявления, такие как:

extern FLOAT32 sp_complex_convolution_A_output_thales[OUTPUTA_LENGTH];

Как правило, не помещайте ничего, что выделяет память, в заголовочные файлы.

Другие вопросы по тегам