当前位置: 技术问答>linux和unix
整数的数据类型问题,我居然也没弄好,大家帮看一下
来源: 互联网 发布时间:2015-10-06
本文导语: 环境 Red Hat Linux 9 测试代码: #include int test_print(char *str) { return(printf("TEST_%sn",str)); } int main() { int (*p)(); /*指向函数的指针*/ printf("Test the code.....n"); p=test_print; /*这句能通过*/ p("OK"); p=printf;...
环境 Red Hat Linux 9
测试代码:
#include
int test_print(char *str)
{
return(printf("TEST_%sn",str));
}
int main()
{
int (*p)(); /*指向函数的指针*/
printf("Test the code.....n");
p=test_print; /*这句能通过*/
p("OK");
p=printf; /*这句出错,cc 或 gcc 都不能通过*/
p("OKn");
exit(0);
}
这段代码在UNIX system V 上通过,但是在Linux上就编译不过
思路: p是一个指向整数型函数的指针,test_printf() 是用户的整数型函数,printf()是系统的整数型函数。
当指针指向用户的整数型函数时,正确,而指向系统的整数型函数就不正确呢?要怎么更改?
谢谢!~~
测试代码:
#include
int test_print(char *str)
{
return(printf("TEST_%sn",str));
}
int main()
{
int (*p)(); /*指向函数的指针*/
printf("Test the code.....n");
p=test_print; /*这句能通过*/
p("OK");
p=printf; /*这句出错,cc 或 gcc 都不能通过*/
p("OKn");
exit(0);
}
这段代码在UNIX system V 上通过,但是在Linux上就编译不过
思路: p是一个指向整数型函数的指针,test_printf() 是用户的整数型函数,printf()是系统的整数型函数。
当指针指向用户的整数型函数时,正确,而指向系统的整数型函数就不正确呢?要怎么更改?
谢谢!~~
|
#include
int printf(const char *format, ...);
你定义为int(*p)();这个类型就不对了。改为
int (*p)(const char *, ...);
int printf(const char *format, ...);
你定义为int(*p)();这个类型就不对了。改为
int (*p)(const char *, ...);
|
既然楼上 lynux(阿奔)说是:printf的定义是 int printf(const char *),所以会出现这个警告。
那我们可以这样改:
int test_print(const char *str) //char * str --> const char *str
{
return(printf("TEST_%sn",str));
}
而你这句: typeof(printf) *ppp = NULL;倒让人看不懂了
要说出错 p=test_print; 这句也应该报警,而不只是到p=printf;这句才报警吧?
那我们可以这样改:
int test_print(const char *str) //char * str --> const char *str
{
return(printf("TEST_%sn",str));
}
而你这句: typeof(printf) *ppp = NULL;倒让人看不懂了
要说出错 p=test_print; 这句也应该报警,而不只是到p=printf;这句才报警吧?
|
可以啊,我也是RH9.0
[root@localhost b]# gcc func_ptr.c -o func_ptr
func_ptr.c: In function `main':
func_ptr.c:14: warning: assignment from incompatible pointer type
[root@localhost b]# ./func_ptr
Test the code.....
TEST_OK
OK
[root@localhost b]#
[root@localhost b]# gcc func_ptr.c -o func_ptr
func_ptr.c: In function `main':
func_ptr.c:14: warning: assignment from incompatible pointer type
[root@localhost b]# ./func_ptr
Test the code.....
TEST_OK
OK
[root@localhost b]#
|
printf的定义是 int printf(const char *),所以会出现这个警告。
#include
int test_p(char *str)
{
printf(str);
}
int main()
{
int (*p)();
typeof(printf) *ppp = NULL;
p = test_p;
p("Test OKn");
ppp = printf;
p("OKn");
p=NULL;
return 0;
}
试一下这段代码,用gcc -ggdb3 a.c编译后,用gdb调试,就可以看出了。
#include
int test_p(char *str)
{
printf(str);
}
int main()
{
int (*p)();
typeof(printf) *ppp = NULL;
p = test_p;
p("Test OKn");
ppp = printf;
p("OKn");
p=NULL;
return 0;
}
试一下这段代码,用gcc -ggdb3 a.c编译后,用gdb调试,就可以看出了。
|
typeof()是gcc的扩展(我也第一次用^_^)
其实我也不知道为什么在p=test_print处没有报警,继续思考中...
其实我也不知道为什么在p=test_print处没有报警,继续思考中...
|
学习