TI中文支持网
TI专业的中文技术问题搜集分享网站

请问 CCS 支持函数指针吗?

最近在利用28346开发项目

发现无论是最新的CCS5.4还是CCS3.3 好像都不支持函数指针呀?

int(*__myfp__)(int, int) =  = (int(*)(int, int))0x1234;;

提示 error: a value of type "int (*)(int, int) C" cannot be assigned to an entity of type "myfp"

请TI的工程师支持一下,谢谢

Young Hu:

函数指针肯定是支持的,但是您这种方式我倒是没用过,改天测一下看看

最近在利用28346开发项目

发现无论是最新的CCS5.4还是CCS3.3 好像都不支持函数指针呀?

int(*__myfp__)(int, int) =  = (int(*)(int, int))0x1234;;

提示 error: a value of type "int (*)(int, int) C" cannot be assigned to an entity of type "myfp"

请TI的工程师支持一下,谢谢

JASON HUANG1:

回复 Young Hu:

HI Mr. Hu

初步网上查了一下资料,如下,  发现不支持函数指针. 不知道是否对你有帮助?

如果不支持的话,这个项目我想就往下做下去了。

http://processors.wiki.ti.com/index.php/C2000_CLA_C_Compiler

 

 

最近在利用28346开发项目

发现无论是最新的CCS5.4还是CCS3.3 好像都不支持函数指针呀?

int(*__myfp__)(int, int) =  = (int(*)(int, int))0x1234;;

提示 error: a value of type "int (*)(int, int) C" cannot be assigned to an entity of type "myfp"

请TI的工程师支持一下,谢谢

10#:

首先,肯定支持函数指针;

第二,下面说的是CLA C编译器不支持,因为它有很多局限性,你使用的C28346是C28x的内核,跟CLA没有关系;

最后,你的这条语句“int(*__myfp__)(int, int) =  = (int(*)(int, int))0x1234;;”应该存在问题:

1. 这应该是初始化,赋值为什么是两个等号?

2. 最后也有两个分号;

3. 常见的定义和初始化应该是分开的,你可以简单搜索一下看看别的例子。

最近在利用28346开发项目

发现无论是最新的CCS5.4还是CCS3.3 好像都不支持函数指针呀?

int(*__myfp__)(int, int) =  = (int(*)(int, int))0x1234;;

提示 error: a value of type "int (*)(int, int) C" cannot be assigned to an entity of type "myfp"

请TI的工程师支持一下,谢谢

JASON HUANG1:

回复 10#:

非常感谢你的回复。谢谢。

关于== 和分号的问题,确实有问题。为了说明问题,我从代码拷贝出来的,做了调整,不好意思。

 

此外 "下面说的是CLA C编译器不支持,因为它有很多局限性,你使用的C28346是C28x的内核,跟CLA没有关系;"

你的意思,其他的编译器是支持的? 请问在CCS中如何选择其他的编译器呢?

最近在利用28346开发项目

发现无论是最新的CCS5.4还是CCS3.3 好像都不支持函数指针呀?

int(*__myfp__)(int, int) =  = (int(*)(int, int))0x1234;;

提示 error: a value of type "int (*)(int, int) C" cannot be assigned to an entity of type "myfp"

请TI的工程师支持一下,谢谢

10#:

回复 JASON HUANG1:

你可以阅读一下“C语言陷阱与缺陷”(或可能叫“C陷阱与缺陷”)这本书,其中2.1章节“理解声明”对你这个问题非常有帮助。

应该可以通过发下方法实现你的功能:typedef int (*myfp)(int, int); int (*(myfp)0x301234)(int, int){//函数体}

另外,后面的描述把问题搞复杂了,我的意思是C2000芯片上目前有两种内核,一是C28x,一是CLA,其中C28x可以使用各种语言编程,所有编译器也都支持,但CLA是很特别的,它虽然支持C语言编程,但有不少限制比如不能支持多层的函数调用。所有C2000芯片上都有C28x,只有一小部分是除了C28x还有CLA,那它的CLA是有限制的,但C28346只有C28x,所以没有任何限制。

最近在利用28346开发项目

发现无论是最新的CCS5.4还是CCS3.3 好像都不支持函数指针呀?

int(*__myfp__)(int, int) =  = (int(*)(int, int))0x1234;;

提示 error: a value of type "int (*)(int, int) C" cannot be assigned to an entity of type "myfp"

请TI的工程师支持一下,谢谢

JASON HUANG1:

回复 10#:

谢谢。

这本书,我上学期间已经阅读过了。应该是C trap and trick.

不好意思,我顶楼的代码是从我的工程部分截取出来的,由于不小心,所以导致两个=和两个;

 

但是我之前纠结的一个问题是:注意下面ERROR信息的红色部分

error #515: a value of type "int (*)(int, int) C" cannot be assigned to an entity of type "int (*)(int, int)"

这个C 字符让人莫名其妙,经过分析,终于找到规律。总结如下:

应该是 不允许   将 类型为C函数的变量或值 赋值 给 C++函数指针变量。

可能有点是不是很清楚: 将以下代码作为CPP文件来编译,

int(*myfp3)(int, int);extern "C" void test_funptr1(){

 myfp3 = ( int(*)(int, int))0x00; // 编译出错; 由于本函数为C函数声明, ( int(*)(int, int)) 也理所当然变成C函数指针类型了.但是myfp3的类型是C++的函数指针

myfp3(0,0);}

void test_funptr2(){

 myfp3 = (int(*)(int, int))0x00;//编译正确 myfp3(0,0);}

我想个中缘由 是

由于编译器对C++的函数类型和C的函数类型处理不一样导致的,在OBJ文件中C++函数,由于编译器的不同,可能扩展为类似__CPP_FUN__,即加了前缀。

 也就是说一般在link阶段会提示出错。

 

目前在编译阶段提示error的还是比较少的。基本没有接触过DSP的编译器,也不好妄加评论。

 

目前在GCC和VS2010上编译链接没有这个问题。

 

 

 

最近在利用28346开发项目

发现无论是最新的CCS5.4还是CCS3.3 好像都不支持函数指针呀?

int(*__myfp__)(int, int) =  = (int(*)(int, int))0x1234;;

提示 error: a value of type "int (*)(int, int) C" cannot be assigned to an entity of type "myfp"

请TI的工程师支持一下,谢谢

10#:

回复 JASON HUANG1:

你的这个分析应该比较到位了,之前没有了解到你是在使用C++,我还理解这个C是常量或地址类型/长度不对呢。

确实编译器对C和C++的函数处理是不一样的,就是前缀的添加。

不过如果你把0x00地址的函数定义为C函数,然后再使用myfunc在C++中调用,只要将前者extern C声明,应该是不会有问题的?

赞(0)
未经允许不得转载:TI中文支持网 » 请问 CCS 支持函数指针吗?
分享到: 更多 (0)