OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 15614|回复: 24

printf重定向老是报错,咋整呢?

[复制链接]

22

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-3-4
在线时间
8 小时
发表于 2015-4-1 11:27:24 | 显示全部楼层 |阅读模式
5金钱
环境:KEIL4.7 + C++
使用了正点原子的源代码,如下:
#if 1
#pragma import(__use_no_semihosting)             
              
struct __FILE
{
    int handle;

};

FILE __stdout;       
 
_sys_exit(int x)
{
    x = x;
}

int fputc(int ch, FILE *f)
{      
    while((USART1->SR&0X40)==0); 
    USART1->DR = (u8) ch;      
    return ch;
}
#endif

微库没有打开,包含文件#include <stdio.h>。但是会报错:
FILE __stdout;
此处报错:Src\bsp.cpp(891): error:  #70: incomplete type is not allowed

_sys_exit(int x)
此处报错:Src\bsp.cpp(893): error:  #260-D: explicit type is missing ("int" assumed)

int fputc(int ch, FILE *f)
此处报错:Src\bsp.cpp(898): error:  #734: function "fputc(int, std::FILE *)" conflicts with using-declaration of function "std::fputc(int, std::FILE *) C"

采用微库方式,也会报错。
搞不懂啥原因,求指点,谢谢。

最佳答案

查看完整内容[请看2#楼]

第一,添加头文件#include 第二,在_sys_exit(int x)[/backcolor] 函数前加void关键词修饰或者在该函数内return一个值[/backcolor]
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

133

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
323
金钱
323
注册时间
2016-11-22
在线时间
66 小时
发表于 2015-4-1 11:27:25 | 显示全部楼层
本帖最后由 ARM学员 于 2017-11-28 16:02 编辑

第一,添加头文件#include <stdio.h>第二,在_sys_exit(int x) 函数前加void关键词修饰或者在该函数内return一个值
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2015-4-1 15:00:31 | 显示全部楼层

试下沟下这玩意!!!!
回复

使用道具 举报

22

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-3-4
在线时间
8 小时
 楼主| 发表于 2015-4-1 15:22:59 | 显示全部楼层
回复【2楼】FantaSy_:
---------------------------------
勾不勾都一样的报错.
回复

使用道具 举报

7

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2282
金钱
2282
注册时间
2013-12-16
在线时间
448 小时
发表于 2015-4-1 16:48:37 | 显示全部楼层
结构变量声明不对应该是 struct FILE __stdout; 
_sys_exit(int x) 函数声明没有注明返回类型,不支持没人的int返回类型,需要明确声明void  _sys_exit(int x)
int fputc(int ch, FILE *f)  -> int fputc(int ch, struct  FILE *f)
回复

使用道具 举报

22

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-3-4
在线时间
8 小时
 楼主| 发表于 2015-4-1 17:10:38 | 显示全部楼层
回复【4楼】zdfwyh:
---------------------------------
Src\bsp.cpp(891): error:  #1340: typedef "FILE" may not be used in an elaborated type specifier
还是不行的,不知道是不是C++语言的问题.
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-4-1 23:39:58 | 显示全部楼层
你啥编译器啊?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

22

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-3-4
在线时间
8 小时
 楼主| 发表于 2015-4-2 08:34:18 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
KEIL4.7,别人用C++写的代码,使用ucos,jtag的线被占用了,只能用串口来调试.
原子大大,咋回事呢?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-4-2 23:03:40 | 显示全部楼层
回复【7楼】arcrong:
---------------------------------
重启电脑试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

22

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-3-4
在线时间
8 小时
 楼主| 发表于 2015-4-3 17:02:00 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
不行哦
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-4-3 22:59:43 | 显示全部楼层
回复【9楼】arcrong:
---------------------------------
这就不太清楚了,呵呵
我用的标准C,你弄的C++,可能有些细节区别了,你得自己找下原因了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2015-4-4 00:24:41 | 显示全部楼层
FILE __stdout;这个应该为struct FILE __stdout;吧。再不行,可以试试吧上面的代码用一个单独的.c文件包含进去编译。类型定义及函数声明放在.h文件里,加入 extern C处理。
业余程序玩家。
回复

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2012-5-5
在线时间
13 小时
发表于 2015-9-18 14:32:08 | 显示全部楼层
如果是keil5 不要勾C99,如果是keil4应该没问题
good good study ,day day up!!!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2015-9-23
在线时间
4 小时
发表于 2016-3-28 15:09:22 | 显示全部楼层
楼主
你这个问题最后怎么解决了?分享一下吧!
回复

使用道具 举报

14

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
356
金钱
356
注册时间
2016-7-20
在线时间
39 小时
发表于 2016-8-13 18:08:42 | 显示全部楼层
我在_sys_exit(int x) 前面加个void好了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-10-25
在线时间
3 小时
发表于 2017-10-25 22:29:16 | 显示全部楼层
这个不要选选择
123.png
回复

使用道具 举报

1

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2016-8-9
在线时间
36 小时
发表于 2017-11-28 15:37:47 | 显示全部楼层
楼上正解
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2016-8-29
在线时间
13 小时
发表于 2018-2-17 17:31:07 | 显示全部楼层
16楼正解。可是为什么呢
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2018-5-12
在线时间
5 小时
发表于 2018-5-12 12:41:44 | 显示全部楼层
楼主你的问题解决了嘛?我和你一样的问题
回复

使用道具 举报

41

主题

242

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2018-5-12 19:26:06 | 显示全部楼层
q1149306406 发表于 2018-5-12 12:41
楼主你的问题解决了嘛?我和你一样的问题

用官方库例程里面的printf,简单,好用。
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2017-8-13
在线时间
8 小时
发表于 2018-6-16 11:16:48 | 显示全部楼层
lilinkai 发表于 2015-9-18 14:32
如果是keil5&nbsp;不要勾C99,如果是keil4应该没问题

就是这个问题!!!!!终于找到了
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2017-10-17
在线时间
18 小时
发表于 2019-3-5 23:07:25 | 显示全部楼层
q1149306406 发表于 2018-5-12 12:41
**** 作者被禁止或删除 内容自动屏蔽 ****

二楼说得对
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-5-8
在线时间
0 小时
发表于 2019-5-8 11:32:23 | 显示全部楼层
#if 1
//??????
#pragma import(__use_no_semihosting_swi)

namespace std{   
    struct __FILE
      {
        int handle;
      };

    FILE __stdout;
    FILE __stdin;
    FILE __stderr;
   
//FILE *fopen(const char * __restrict /*filename*/,
//                           const char * __restrict /*mode*/)
//    {
//        usart1<<"\n\r fopen. \n\r";
//        return NULL;
//    }

    int fputc(int ch, std::FILE *f)
      {
                while((USART1->SR&0X40)==0);//???fputc
            USART1->DR = (u8) ch;      
                return ch;
      }

//    int fgetc(FILE *f) {
//        /* Your implementation of fgetc(). */
//        usart1<<"\n\r fgetc \n\r";
//        return 0;
//    }
   
    int ferror(FILE *stream)
      {
        /* Your implementation of ferror(). */
        return 0;
      }

//    long int ftell(FILE *stream){
//        /* Your implementation of ftell(). */
//        usart1<<"ftell\n\r";
//        return 0;
//    }
   
//    int fclose(FILE *f){
//        /* Your implementation of fclose(). */
//        usart1<<"\n\r fclose \n\r";
//        return 0;
//    }
   
//    int fseek(FILE *f, long nPos, int nMode){
//        /* Your implementation of fseek(). */
//        usart1<<"fseek\n\r";
//        return 0;
//    }
   
    int fflush(FILE *f)
      {
        /* Your implementation of fflush(). */
        return 0;
      }
  
        extern "C" void  _sys_exit(int)
          {
        /* declared in <stdlib.h> */
        abort();
        while(1);
      }
   
        extern "C" void _ttywrch(int ch)
          {
                while((USART1->SR&0X40)==0);
            USART1->DR = (u8) ch;      
        return ;
      }
}

#endif
我用C++弄,前面改成这样就可以用了
回复

使用道具 举报

12

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2018-3-19
在线时间
96 小时
发表于 2019-5-31 15:04:04 | 显示全部楼层
梅子 发表于 2019-5-8 11:32
#if 1
//??????
#pragma import(__use_no_semihosting_swi)

厉害.....;确实按你说的这样改用c++方式编译能通过
回复

使用道具 举报

66

主题

224

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1349
金钱
1349
注册时间
2018-10-4
在线时间
200 小时
发表于 2019-8-9 09:03:53 | 显示全部楼层
梅子 发表于 2019-5-8 11:32
#if 1
//??????
#pragma import(__use_no_semihosting_swi)

你好,我新建了个cpp文件,用你的程序,但是会报错“.Error: L6200E: Symbol __stdout multiply defined (by stdio_streams.o and printf_relocate.o).”。这个怎么解决呢?谢谢!
吾虽浪迹天涯 却未迷失本心
欢迎光临我的CSDN博客
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-6 20:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表