打印
[STC单片机]

编程时候遇到的问题

[复制链接]
2274|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
onlyOMG|  楼主 | 2015-8-8 09:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在编写一个C文件时候,对应编写了一个h头文件,也把头文件include进了C文件里面。我在h文件里面申明了一个struct,然后在C文件里面引用。结果编译就出错,*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS,求大神解答~

相关帖子

沙发
any012| | 2015-8-8 10:02 | 只看该作者
多重定义了...
不知道你头文件里有没有:
ifndef  __xx_h
define  __xx_h
endif

使用特权

评论回复
板凳
ayb_ice| | 2015-8-8 10:19 | 只看该作者
头文件里不要定义变量,一包是定义结构类型和声明变量,变量定义在C文件里
定义的话只能定义一次(多次被包含可能会多次定义)

ifndef  __xx_h
define  __xx_h
endif

这个是用于防止一个C文件多次包含同一头文件,不能解决多次定义变量的问题

使用特权

评论回复
地板
any012| | 2015-8-8 10:34 | 只看该作者
ayb_ice 发表于 2015-8-8 10:19
头文件里不要定义变量,一包是定义结构类型和声明变量,变量定义在C文件里
定义的话只能定义一次(多次被包 ...

受教了.

使用特权

评论回复
5
ningling_21| | 2015-8-8 10:39 | 只看该作者
定义或声明写的有问题

使用特权

评论回复
6
bhuner| | 2015-8-8 11:39 | 只看该作者
某些编译器   结构体不能作为函数参数,  不知道你是怎么调用的

使用特权

评论回复
7
ayb_ice| | 2015-8-8 11:39 | 只看该作者
bhuner 发表于 2015-8-8 11:39
某些编译器   结构体不能作为函数参数,  不知道你是怎么调用的

用指针效率高些

使用特权

评论回复
8
bhuner| | 2015-8-8 11:41 | 只看该作者
ayb_ice 发表于 2015-8-8 11:39
用指针效率高些

-> 嗯呢

使用特权

评论回复
9
onlyOMG|  楼主 | 2015-8-8 18:16 | 只看该作者
ningling_21 发表于 2015-8-8 10:39
定义或声明写的有问题

我在头里面,是typedef struct {}这个结构体,紧接着在花括号外申明这个结构体变量的,会有错么?

使用特权

评论回复
10
onlyOMG|  楼主 | 2015-8-8 18:18 | 只看该作者
ayb_ice 发表于 2015-8-8 11:39
用指针效率高些

问题在于,我申明了就有这个错误。

使用特权

评论回复
11
onlyOMG|  楼主 | 2015-8-8 18:19 | 只看该作者
bhuner 发表于 2015-8-8 11:39
某些编译器   结构体不能作为函数参数,  不知道你是怎么调用的

子函数里面,用变量名.成员名来引用结构体的。

使用特权

评论回复
12
onlyOMG|  楼主 | 2015-8-8 18:20 | 只看该作者
bhuner 发表于 2015-8-8 11:39
某些编译器   结构体不能作为函数参数,  不知道你是怎么调用的

KEIL uV4

使用特权

评论回复
13
songchenping| | 2015-8-8 18:32 | 只看该作者
学习了。

使用特权

评论回复
14
ningling_21| | 2015-8-8 18:42 | 只看该作者
本帖最后由 ningling_21 于 2015-8-10 08:50 编辑
onlyOMG 发表于 2015-8-8 18:16
我在头里面,是typedef struct {}这个结构体,紧接着在花括号外申明这个结构体变量的,会有错么? ...

struct student
{
          uchar name;
        uchar num;

}st1,st2;

头文件中这样定义,且该头文件不被重复包含时不会报错

使用特权

评论回复
15
onlyOMG|  楼主 | 2015-8-8 23:45 | 只看该作者
ningling_21 发表于 2015-8-8 18:42
struct student
{
          uchar name;

后来我通过把这个struct定义放在对应的C文件里就可以通过编译了,想知道是为什么会有这个出错。

使用特权

评论回复
评论
ningling_21 2015-8-10 08:49 回复TA
不要在头文件中定义变量或结构体,如果头文件中有定义就不要被多个C文件包含 
16
ywlzh| | 2015-8-9 08:30 | 只看该作者
onlyOMG 发表于 2015-8-8 23:45
后来我通过把这个struct定义放在对应的C文件里就可以通过编译了,想知道是为什么会有这个出错。 ...

应该是一个是预编译一个是预处理

使用特权

评论回复
17
diweo| | 2015-8-9 19:24 | 只看该作者
struct student
{
          uchar name;
        uchar num;

}st1,st2;
其实是把声明结构和定义结构变量两步并一步了。

如果放到.h文件里,并且.h文件被多次include,那就会提示重复定义。

如果放到.c文件里,(虽然实际上是可以的,但是)一般来说,别的文件不会include这一个.c,所以一般不会存在重复定义的问题。

使用特权

评论回复
18
diweo| | 2015-8-9 19:32 | 只看该作者
所以归根到底还是那句话,头文件里不要定义变量!

但是,有的时候这个变量有有可能被别的文件用到,如果不放在.h文件里,那别的.c不就看不见它了吗?
没关系,我们可以在前面加extern
.h文件里面:extern int a;
在.c文件里面:int a;

概念上要弄清,如果不加extern,叫做变量定义,如果加上extern ,叫做变量声明。

在头文件里面定义变量是不行的,但是声明变量是没关系的。

使用特权

评论回复
19
ayb_ice| | 2015-8-10 07:53 | 只看该作者
ningling_21 发表于 2015-8-8 18:42
struct student
{
          uchar name;

这样被多次包含当然出错了,你在C文件里试试就不鉣出错了

使用特权

评论回复
20
bhuner| | 2015-8-10 12:46 | 只看该作者
onlyOMG 发表于 2015-8-8 18:19
子函数里面,用变量名.成员名来引用结构体的。

下面是即兴写的,不知道有错没有,  但大概原理应该是这样吧,   

test.h
//******************//
#ifndef _TEST_H_
#define _TEST_H_
typedef struct
{
     int Num;
     char Name[20];
}ST;

void Init_test(ST *student, int data, char *ptr);
#endif

test.c
//*************************//
#include "test.h"

void Init_test(ST *student, int data, char *ptr)
{
     int i;
     student->Num = data;
     for(i = 0; i < n; i++)
     {
           student->Name = ptr;
     }
}

main.c
//***************************//
#include "test.h"

ST  Student1;
void main(void)
{
    int Data = 1;
    char Ptr[] = "    ";
    Init_test(Student, Data, Ptr);    //Student.Num = 1    Student.Name = "   "
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

13

帖子

0

粉丝