C语言 : Header inclusion makes unexpected behavior

标签 c header-files

我现在有一个严重的问题,真的很想找出根本原因是什么。

函数源文件:

//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”(正确!)!

有人知道根本原因吗?

最佳答案

从“stupid.h” header 泄漏的#define 与您的函数定义发生冲突。

您可以插入一个 printf 来查找 TIFRAME 的值...

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

或者,更巧妙地,使用符号粘贴将 TIFRAME 转换为字符串...

或者,只是修复/避免。您在此处包含的“stupid.h”扩展了 tiFrame 的#define ...

#define tiFrame TIFRAME

所以,避免这种碰撞,

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

你甚至不需要在这里提及参数名称,

//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

关于C语言 : Header inclusion makes unexpected behavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21925234/

相关文章:

c++ - 这是什么 C++ 语言构造 : # (i. e。哈希)整数 "path_to_header_or_cpp_file"<整数>?

需要显式调用 free() 的 C 函数

c - 是否可以重新定义#warning?

c - 关于 fopen 中的二进制模式

c - 优先队列 C

c++ - 具有前向声明的相互依赖的 .h 文件

c - 如何在纯 C 和 CUDA C 文件中包含头文件?

c - 有没有办法查看 ctype.h 中的类型中有哪些字符?

c++ - 减轻头文件中的长限制

c - 动态结构声明