C语言编译的问题

weidu23 2012-11-19 11:02:59
首先,请看代码,最后面提问题:

我从百度里抄了一个代码:

#include <stdio.h>#include <signal.h>

enum { RED, GREEN, BLUE };

void OutputSignal(int sig)

{

printf("The signal you /'ve input is: ");

switch(sig)

{

case RED:

puts("RED!");

break;

case GREEN:

puts("GREEN!");

break;

case BLUE:

puts("BLUE!");

break;

}

}

void ( *signal( int sig, void (*func)(int) ) ) (int)

{

puts("Hello, world!");

func(sig);

return func;}

int main(void)

{

(*signal(GREEN, &OutputSignal))(RED);

return 0;

}

===================

问题来由:

首先,我在VC++6.0里面编译,结果,编译通过,重建失败,失败的提示为:

LIBCD.lib(winsig.obj) : error LNK2005: _signal already defined in a.obj

Debug/a.exe : fatal error LNK1169: one or more multiply defined symbols found

执行 link.exe 时出错.

后来,我用命令行编译,如下:

C:\Documents and Settings\Administrator>F:

F:\>cd use_C_etc

F:\use_C_etc>cl a.c

编译通过,并且输出结果:

Hello, world!

The signal you /'ve input is: GREEN!

The signal you /'ve input is: RED!




问题:

1、为什么我用VC编译就错了!到底错在哪?

2、为什么命令行就对了,这个中差别在哪?
...全文
181 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
HMGuardian 2012-11-20
  • 打赏
  • 举报
回复
嗯,malloc反回的的确是一个void指针,但你自己不是把反回的强制转成int指针了么? p=(int *)malloc(...) // malloc前的那个(int *)就是对函数反回的指针进行强制转换啊 如果我不加malloc前的强制转换,也就是去掉(int *),一样会出警告的。
weidu23 2012-11-20
  • 打赏
  • 举报
回复
引用 6 楼 JQGuardian 的回复:
嗯,函数的反回值是void *这种情况,你在return所加不加(void *)都一样,只是一个有警告,一个没有。编译器在处理的时候会自动帮你转换为void *类型。因此,不管你return后加不加(void *),你在函数调用后得到的那个指针都是void指针或者是你接收指针的类型(编译器自动转换)。
那么为什么malloc就没事呢? 而且,malloc还可以在不进行强制类型转换时使用! 比如 p=malloc(...),而不一定要p=(int *)malloc(...) 而我们自己写一个,就出现警告了! 比较纠结!
HMGuardian 2012-11-20
  • 打赏
  • 举报
回复
嗯,函数的反回值是void *这种情况,你在return所加不加(void *)都一样,只是一个有警告,一个没有。编译器在处理的时候会自动帮你转换为void *类型。因此,不管你return后加不加(void *),你在函数调用后得到的那个指针都是void指针或者是你接收指针的类型(编译器自动转换)。
weidu23 2012-11-20
  • 打赏
  • 举报
回复
引用 4 楼 JQGuardian 的回复:
嗯,如果是因为signal.h包含了多次的话,似乎是不太可能的。 呵呵!你等等看有木有其他人给点好方法。
好吧 ... 谢你了! 对了,我突然想起来,我以前碰到一个这样的问题,想同时请教你一下, 我有一个函数,他的返回值是一个void *,那么我的void *该怎么写呢? 因为我不管怎么写,老是出现warning!非的要在return这里加上(void *)才行, 可是这样写又把会出问题,比如我返回数据int *类型的a,结果写return (void *)a, 心里觉得这样好危险! 希望指点下子!!!
HMGuardian 2012-11-19
  • 打赏
  • 举报
回复
嗯,如果是因为signal.h包含了多次的话,似乎是不太可能的。 呵呵!你等等看有木有其他人给点好方法。
weidu23 2012-11-19
  • 打赏
  • 举报
回复
引用 2 楼 JQGuardian 的回复:
链接时候发生的错误,符号_signal重定义。 嗯,看看哪vc编译的时候产生了哪些.obj文件,反编译来看看除了a.obj之外哪些文件中还_signal 用VC编译会将工程中所有的.c文件生成.obj文件,然后再链接成一个.exe文件。如果一个符号被定义了两次,那么在链接的时候链接器将不知道使用哪一个。 用命令编译时只有a.obj文件生成,所以不会有其他的_signal符号。 目测……
果然是重定义了!!! 那么,如果我不想改掉我原来代码里的signal,那么我该怎么改代码呢? 菜鸟求教!
HMGuardian 2012-11-19
  • 打赏
  • 举报
回复
链接时候发生的错误,符号_signal重定义。 嗯,看看哪vc编译的时候产生了哪些.obj文件,反编译来看看除了a.obj之外哪些文件中还_signal 用VC编译会将工程中所有的.c文件生成.obj文件,然后再链接成一个.exe文件。如果一个符号被定义了两次,那么在链接的时候链接器将不知道使用哪一个。 用命令编译时只有a.obj文件生成,所以不会有其他的_signal符号。 目测可能是signal.h重复包含。可以在signal.h中使用编译控制宏: #ifndef __SIGNAL_H #define __SIGNAL_H //文件正文 #endif
lbq199204 2012-11-19
  • 打赏
  • 举报
回复
帮顶下!也有点疑问,是什么细节的东西呢?

70,020

社区成员

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

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