2014-02-21 4 views
2

У меня сейчас серьезная проблема, и я действительно хочу узнать, в чем причина.Язык C: включение заголовка приводит к неожиданному поведению

Функция исходного файла:

//function.c 
#include "function.h" 
void FunctionA (int tiFrame) 
{ 
    printf ("%d", tiFrame); 
} 

Функция Заголовочный файл:

//function.h 
extern void FunctionA (int tiFrame); 

Глупое вне заголовка файла:

// stupid.h 
#define tiFrame TIFRAME 

Применение:

//application.c 
#include "stupid.h" 
#include "function.h" 

void App2() 
{ 
    FunctionA (10); 
} 

Результат: FunctionA всегда печатается «0» (нулевое значение)!

Теперь я изменил файл приложения:

//application.c 
#include "function.h" 
#include "stupid.h" 

void App2() 
{ 
    FunctionA (10); 
} 

Результат: (! Правильно) FunctionA всегда напечатанный "10"!

У кого-нибудь есть представление о первопричине?

+0

См. Предварительный выход приложения application.c. Это может дать некоторый намек. – doptimusprime

+0

@KhangLe, что такое TIFRAME? – mangusta

+0

@mangusta: #define TIFRAME 15. Кстати, определение «tiFrame» должно быть удалено, но это не так, поэтому я застрял с ним. –

ответ

1

У вас есть столкновение между #define, просочившимся из заголовка "stupid.h", и сталкивается с определением вашей функции.

Вы можете вставить Printf, чтобы найти значение TIFRAME ...

printf("%d\n", TIFRAME); 

Или, более умно, используйте символ вставки для преобразования TIFRAME в строку ...

Или просто исправить/избежать. Ваше включение «stupid.h» здесь расширяет #define для tiFrame ...

#define tiFrame TIFRAME 

Таким образом, избежать этого столкновения,

//function.c 
#include "function.h" 
void FunctionA (int arg_tiFrame) 
{ 
    printf ("%d", arg_tiFrame); 
} 

Вам не нужно даже упоминать имя ARG здесь ,

//function.h 
extern void FunctionA (int); 

Или вы могли бы указаного tiFrame до вашей функции ...

//stupid.h declares tiFrame, gotta avoid that 
#define CleverAvoidance tiFrame 
#undef tiFrame 
//function.c 
#include "function.h" 
void FunctionA (int tiFrame) 
{ 
    printf ("%d", tiFrame); 
} 
//and put it back the way it was, or just fugeddaboudit 
#define tiFrame CleverAvoidance 
0

Различное поведение приписывается программой preprocess.

case1:

#include "stupid.h" 
#include "function.h" 

После preprocess:

#define tiFrame TIFRAME 
extern void FunctionA (int TIRAME); //the parameter is changed to const 
void App2() 
{ 
    FunctionA (10); //the call parameter is still the const TIRAME 
} 

Случай 2:

#include "function.h" 
#include "stupid.h" 

После preprocess:

extern void FunctionA (int tiFrame); //the parameter is still the varibale 
#define tiFrame TIFRAME 
void App2() 
{ 
    FunctionA (10); //the parameter is 10 in this case 
} 

PS: Вы бы лучше не писать такой некорректный код. Следуйте за KISS priciple, couse другие люди могут читать и использовать ваш код.

+0

Привет! Это реальная ситуация в моем проекте. Из-за конфиденциальности мне пришлось изменить имя функции и имя файла. Вы разработали свои компоненты так долго, а теперь вы поняли, что некоторые новые макросы имеют то же имя, что и у вас. –

+0

Если вы используете 'UPCASE' для' MACROS', 'downcase' для' параметров'. У вас не будет этой проблемы. – luoluo

Смежные вопросы