cyradg 发表于 2021-2-20 11:02

请教一个简单的C语言问题

我一直用大飞,现在在弄些AVR,只有C了,涉及到一些问题。比如有三个头文件A.h,B.h,C.h,我在A.h里面定义了一个结构typedef struct {....(省略)}BIT_FILED;我在B.h里面#include <A.h>,在C.h里面也有#include <A.h>,我查!!!AVR STUDIO 根咱杠上了,说BIT_FILED相互抵触,conflicting types for 'BIT_FIELD'

hfshen 发表于 2021-2-20 11:14

C语言就是这样的,不能重复定义。

cyradg 发表于 2021-2-20 11:21

hfshen 发表于 2021-2-20 11:14
C语言就是这样的,不能重复定义。

那怎么解决呀,因为我不同的功能都需要这个定义,难道把包含的头文件A.h重复写一遍?这不符模块化合原理呀。

allen3371 发表于 2021-2-20 11:23

我记得好像有宏ifndef....先判断,再定义

jiang12345 发表于 2021-2-20 11:25

allen3371 发表于 2021-2-20 11:23
我记得好像有宏ifndef....先判断,再定义

正确。

cyradg 发表于 2021-2-20 11:33

刚网上找的,说是头文件被重复引用造成,自己加#ifndef......#deinfe......#endif,把typedef放在那里面,也就是谁先引用,谁先占掉define标识符,后续的就不包含这个定义,果然有效,我查!!C语言就是*!

dstboxu 发表于 2021-2-20 11:34

除了undefine 还可以:在B.h里面不要#include <A.h>

dstboxu 发表于 2021-2-20 11:36

dstboxu 发表于 2021-2-20 11:34
除了undefine 还可以:在B.h里面不要#include

ifndef

szxw 发表于 2021-2-20 15:55

在430和NEC的C中,没有问题啊~
比如在typedef.h中定义了一个结构类型TIME,然后在其他.C文件中#include typedef.h,没有报错。
再在def.h中定义一个TIME的结构变量,然后在其他.C文件中#include def.h
引用TIME中的变量时,也无报错。

bingyang 发表于 2021-2-20 22:01

C语言的头文件一般要做防重复包含的处理,入a.h,里面会使用#ifndef __A_H__#define __A_H__#endif,同一个宏不应该在多个头文件里重复定义,如果是历史遗留问题,不得不兼容,可以考虑使用#ifdef XXX#undef XXX #endif#define XXX

bingyang 发表于 2021-2-20 22:02

你这个问题只要在头文件加上防重复包含的处理就可以了

xu_john 发表于 2021-2-21 09:38

去参考其它的glibc或者任何正常的头文件的前面三行有效代码, 都是#ifndef __xxx_H #define __xxx_H ,就是用这个控制的.

streer 发表于 2021-2-25 14:25

宏不可以重复定义,函数在不同子程序里的重用话,用extern就可以了。
页: [1]
查看完整版本: 请教一个简单的C语言问题