高手请关注:关于有条件编译的问题,详情如下所述

iopl 2003-07-20 02:23:44
假设头文件和程序体文件分别为:test.h test.c
在test.c中,有如下代码:

...
#ifdef TEST
void Test1(void)
{
...
}
#endif
...

要在另一个文件app.c中调用Test1函数,首先包含头文件test.h
但是编译的结果是:link...Undefined symbol 'Test1',referred to from '..\app.o'

调用时已经做了如下处理:
#define TEST 1
为什么还会出现未定义的错误呢?

请各位高手不吝赐教:)
...全文
99 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fwinfwin 2003-08-19
  • 打赏
  • 举报
回复
#ifdef TTT好像只管TTT是否定义了,不管是否为0都行的啊!
怀疑iopl说的话!
softworm163 2003-07-27
  • 打赏
  • 举报
回复
刚想写,才发现 lifanxi(Byron) ( ) 已经说清楚了

不说了
lemonutzf 2003-07-26
  • 打赏
  • 举报
回复
条件编译是在编译过程中进行的,而编译对每个文件是独立处理的,即在app.c中的定义语句
#define TEST 1 ,在编译时,对 test.c 来说是一无所知的,也就是说它当TEST是没有定义的,所以会出像你所看到的样子。 lifanxi(Byron) ( ) 说得对,你应该把条件编译语句放到头文件中。
cityvagrant 2003-07-25
  • 打赏
  • 举报
回复
你在编译选项中加上/D TEST试试
happyhackwang 2003-07-25
  • 打赏
  • 举报
回复
stupid!!!!!

#ifdef TEST
void Test(void)
{
//...
}
#else
void test(void)
{
}
#endif

so you can use the same function name and only same call code.
lifanxi 2003-07-23
  • 打赏
  • 举报
回复
如果是这样的话,头文件和实现文件中应同时做好条件编译。保证函数能得到正确的声明。
iopl 2003-07-20
  • 打赏
  • 举报
回复
谢谢lifanxi关注,实际情况是这样的:
test.c
//....
void Test(void)
{
//...
}
#ifdef TEST
void Test1(void)
{
//...
}
#endif

如果TEST的值为非零,就调用Test1函数;否则调用Test函数。
在app.c中,将TEST置为1,调用Test1函数。Test和Test1函数的实现要访问相同数据。所以要这么用。
lifanxi 2003-07-20
  • 打赏
  • 举报
回复
我怎么好像觉得你没有理解头文件的用法,像你的情况一般是这样用的:
test.c
void Test1(void)
{
//...
}

test.h
#ifndef TEST_H
#define TEST_H
void Test1(void);
#endif

app.c
#include "test.h"
void main()
{
Test1();
}
lifanxi 2003-07-20
  • 打赏
  • 举报
回复
我怎么好像觉得你没有理解头文件的用法,像你的情况一般是这样用的:
test.c
void Test1(void)
{
//...
}

test.h
#ifndef TEST_H
#define TEST_H
void Test1(void);
#endif

app.c
#include "test.h"
void main()
{
Test1();
}

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧