最近在利用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声明,应该是不会有问题的?