c/c++ 前置声明 -- typedef问题

前几天写过前置声明的问题,不过今天写代码时又遇到了同样的问题,不过是一个typedef出来的问题。


前置声明的好处很多, 比如能避免头文件互相包含的冲突, 比如有时我们在一个头文件中只需要另一个头文件的某个类型定义, 只需要对它做一下前置声明即可,

因为为了相对较小的目的要包含进来一个很大的头文件, 实在有些"不值", 况且这个头文件可能还要被其它很多文件再包含的, 这样代价就更大了.

所以做前置声明即可, 在源文件真正需要的时候再包含那个头文件.

之前也声明过类和c++方式定义的struct, 今天遇到了一个typedef的结构体, 结果前置声明不奏效了.

网上查了些资料, 有的帖子没有讨论出结果, 有的直接定性typedef的不能前置声明, 只能include进来.

幸好自己写小例子多测试了一会, 发现语法上还是支持的. 举例如下:

#coord.h:

typedef struct coord_t
{
    int hour, minute, second;
} my_coord_time;


#flagment.h
// #include "coord.h"  不需要增加该头文件,采用前置声明的方式

struct coord_t;
typedef struct coord_t my_coord_time;
 
void set_and_print(my_coord_time* mtime) {}

#main.cpp

#include "coord.h"
#include "flagment.h"
 
int main(){
    my_coord_time mtime;
    func(&mtime);
 
    return 0;
}

这样就可以成功了. 在flagment.h中做前置声明时, 先声明有my_coord_time_t这样一个struct, 然后说明 my_coord_time 是由那个结构体typedef出来的, 

这样void set_and_print(my_coord_time* mtime)这个函数声明就能编译通过了.   直接做struct my_coord_time;这样的前置声明是不被接受的.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.读取excel表格(JAVA)

读取excel表格(JAVA)偶尔写个小程序,让办公更简单一些。在这里使用到JXL(Java Excel API)用来动态读写Excel文件。JXL的主页是:http://www.andykhan.com/jexcelapi/,可以在这里下载到它的最新的版本。将包下载下来后将…

TextTree - 文本资料收集轻量级工具

你有没有收集资料的习惯? 如果有久而久之你会发现资料越来越多,找起来很麻烦. 过去我收集资料,单个文件,资料太多不好找,就分成多个文件. 文件一多,有时会乱放,结果结果经常满硬盘搜索,就为了找一个文件,于是我后来就集中放在同一个文件夹. 文件夹里的文件一多,看文件名也是眼…

Spring Boot分布式系统实践【扩展1】shiro+redis实现session共享、simplesession反序列化失败的问题定位及反思改进...

前言 调试之前请先关闭Favicon配置 spring:favicon:enabled: false 不然会发现有2个请求(如果用nginx 浏览器调试的话) 序列化工具类【fastjson版本1.2.37】 public class FastJson2JsonRedisSerializer implements RedisSerializer { public static fin…

svn: E200033: database is locked, executing statement 'RELEASE   s0' 问题解决办法

前几天svn迁移到其他路径之后,今天早上更新代码时,出现了下面的问题: svn: E200033: database is locked, executing statement RELEASE s0 稍后执行了 svn cleanup svn up 等命令之后都不好使 网上查找资料尝试整了一遍之后是可以的&…

Apache + Tomcat 配置多个应用

转自:http://www.360doc.com/content/11/0415/11/1531394_109787714.shtml转载于:https://www.cnblogs.com/ribavnu/archive/2012/11/06/2757390.html

哈希(hash)表查找速度为什么那么快?快在哪里了?

先看数组存储数据是怎么样的。 现在有一个数组,它里面每个单元存储的是数据的地址 这叫指针数组吧,假设它有100个单元 我们称他为p[100] 现在我想把一百个数据(地址)放到里面 我们想把某个数据放到p的第几个单元完全是由 我…

Getting Started with the Table Component

为什么80%的码农都做不了架构师?>>> Home Wiki Getting Started with the Table Component Getting Started with the Table Component Table of Contents [hide] Creating Your First Report using the Table Component Step 1: Create a datasourc…

.NET Framewrok 4.0新增类库

转载于:https://www.cnblogs.com/tweet/archive/2010/02/08/1665805.html

在构造函数/析构函数中调用virtual函数带来的影响

在构造函数/析构函数中调用virtual函数&#xff0c;那么调用的一定是本类中的virtual函数。 先看一段代码&#xff1a; #include<iostream>class Base { public:Base() {print();}~Base() {print();}virtual void print() {std::cout << "Base::print"…

编程之美-第3章 结构之法

3.1. 字符串移位包含问题 方法1: 分别对字符串进行循环移1位,2位,3位…,来判断给定的字符串是否是其中一个字串. 复杂度是O(n^3) 方法2: 这也是一种利用空间换时间的方法. 代码如下, 为了简便实现,采用了C库中的字符串操作函数: #if 0 /** 3.1*/ bool isRotate(char *s1,char* …

每天学习一点点(2010年二月)

2010/2/8号 星期一 1.决定记录下每天学到的东西和感悟 2.看老赵的博客&#xff0c;学到一句话&#xff1a;Apple告诉我们的铁律是&#xff1a;表面功夫一定要做足。 3.看到一个笑话&#xff1a;你属什么&#xff1f;我属 于你。 2010/2/9号 星期二 1.减少页面中独立的请求数&…

InnoDB一棵B+树可以存放多少行数据?

一个问题&#xff1f; InnoDB一棵B树可以存放多少行数据&#xff1f;这个问题的简单回答是&#xff1a;约2千万。为什么是这么多呢&#xff1f;因为这是可以算出来的&#xff0c;要搞清楚这个问题&#xff0c;我们先从InnoDB索引数据结构、数据组织方式说起。 我们都知道计算…

调整路由的AD值

实验&#xff1a;调整路由的AD值【实验名称】调整路由的AD值 (注意&#xff1a;PT有可能不支持distance 99 192.168.1.2 0.0.0.0这条命令&#xff0c;所以我们做实验的时候最好用小凡模拟器)【实验目的】通过调整路由的管理距离值&#xff0c;实现路由的管理和控制【实验背景】…

C#学习日志三(流程控制语句)

if条件语句&#xff1a;根据某个条件对成都的执行进行两路分支。语法&#xff1a;if(条件){语句块1}else{语句块2}*else部分并不是必须存在的。 switch...case条件选择语句&#xff1a;当分支条件很多时&#xff0c;使用。语法&#xff1a;switch(控制表达式){case 常量表达式1…

MySQL索引的一些问题

MySQL索引的一些问题 注意&#xff1a;本文基于MySQL的InnoDB引擎说明。 一、什么是最左前缀原则 对于该表&#xff0c;如果按照name字段来建立索引的话&#xff0c;采用B树结构&#xff0c;大概的索引如下&#xff1a; 如果要进行模糊查找&#xff0c;查找name 以“张"…

线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析...

最近&#xff0c;在做一个使用线程控制下载文件的小程序&#xff08;使用进度条控件显示下载进度&#xff09;时&#xff0c;遇到这样的问题&#xff0c; 错误显示&#xff1a; 未处理的“System.InvalidOperationException”类型的异常出现在 System.Windows.Forms.dll 中。 其…

大家狂欢吧,我的Google帐号悲剧了

大家狂欢吧&#xff0c;我的Google帐号悲剧了 今早开始&#xff0c;鄙人在Google Code上突然被强行杯具&#xff0c;出现如下图。 最无奈的是询问Google Code管理组后得到回复如下。 然后管理员就睡觉去了|||…… 继续等待中&#xff0c;能恢复的话我会发个解决心得以警后人&am…

Hive简单实际操作(二)

两个常用的交互命令 不用启动hive就可以执行的命令 1. bin/hive -e "select * from default.animal;" 可以直接显示指定命令后的内容 2. 创建一个sql文件 vi hivef.sql 在文件内部添加你希望执行的命令例如: select * from default.animal; bin/hive -f /opt/module/…

在数据库中, 不用max()/min()找出一个列中最大/最小值的记录

不用max()/min()找出c1列中最大/最小值的记录 // 找出c1列中&#xff0c;c1是最小值的那条记录&#xff0c;不能用min() select * from t1 where c1 < all(select c1 from t1); // 找出c1列中&#xff0c;c1是最大值的那条记录&#xff0c;不能用max() select * from t1 …

C眼看J - 初窥JAVA

最近一直在学习JAVA&#xff0c;出发点并不是像当初学C那样&#xff0c;而只是想把JAVA作为下学期参加比赛的工具&#xff0c;带着这种“浮躁”的心态&#xff0c;使得我总是在想“这个用看么&#xff1f;”、“那个用看么&#xff1f;”。 这是第一次在掌握了一门语言&#xf…