今天又往山上加了,问一下超长头文件如何处理 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AlohaV2
V2EX    C++

今天又往山上加了,问一下超长头文件如何处理

  •  
  •   AlohaV2 2020-07-21 19:59:33 +08:00 6009 次点击
    这是一个创建于 1974 天前的主题,其中的信息可能已经有所发展或是发生改变。
    头文件里有很多宏+模板的代码,因为如此 class 和 struct 的声明和实现全在里面,一个头文件有接近 2000 行长。今天想加点功能,然后又往里面塞东西了.... 感觉有点不爽,不知道各位大佬有没有解决方案?用 ipp 么?

    编译环境是 C++14, clang / msvc

    C++20 里面有个`export`的关键词能用,可惜鄙司项目离 20 还远....哎...
    23 条回复    2020-07-23 12:43:01 +08:00
    allAboutDbmss
        1
    allAboutDbmss  
       2020-07-21 20:39:02 +08:00
    2000 行很长吗...我很弱弱问一句
    SingeeKing
        2
    SingeeKing  
    PRO
       2020-07-21 21:46:03 +08:00   1
    2000 行真不长…… 很多开源项目都是这样
    LifStge
        3
    LifStge  
       2020-07-21 22:09:08 +08:00
    确实这个不算长
    你这样想 你把超长头文件 分成很多不同的小文件 那么 你用的时候怎么办呢 详细记住哪个东西在哪个文件里面啊 自己分的 那还好 再比如 这些是别人 很多人 分的的 你确定你知道哪个在哪个里面么 写个代码不头疼死么 写次代码 翻次文档 没有文档 挨个翻源码啊..
    LifStge
        4
    LifStge  
       2020-07-21 22:11:28 +08:00
    现在 代码的多少 都加进屎山的定义了么
    CismonX
        5
    CismonX  
       2020-07-21 22:27:56 +08:00 via iPhone   1
    用预编译头,可以在头文件不变的时候加快源文件的编译速度

    我之前用很多模版库,比如 boost,再比如 armadillo 等等,都是这么搞的

    另外 2000 行真的不长。公司里有个项目,头文件加起来有十几万行
    xcstream
        6
    xcstream  
       2020-07-22 00:19:27 +08:00
    include 套娃
    MrKou47
        7
    MrKou47  
       2020-07-22 00:41:04 +08:00 via iPhone
    我感觉头文件挺好的。。总比分散在项目中好啊
    msg7086
        8
    msg7086  
       2020-07-22 02:01:14 +08:00 via Android
    那你拆成一堆头文件屎饼啊…
    ericgui
        9
    ericgui  
       2020-07-22 04:53:18 +08:00
    @CismonX 请问贵司啥项目?
    chinuno
        10
    chinuno  
       2020-07-22 08:42:18 +08:00 via Android
    如果不是作为库使用的话可以提供一个思路。
    模板的实现写在 cpp 里面,然后 cpp 里面显式实例化。需要哪个类的实现就在 cpp 加一句重新编译 cpp 就可以
    AlohaV2
        11
    AlohaV2  
    OP
       2020-07-22 09:53:50 +08:00
    @chinuno 类似`using SpecifiedSomeClass = TemplatedClass<Foo>;` 这样的吗
    meteor957
        12
    meteor957  
       2020-07-22 09:56:40 +08:00
    2000 行一般吧 不算很长了
    newmlp
        13
    newmlp  
       2020-07-22 10:10:48 +08:00
    2000 行不长,真不长
    GuangXiN
        14
    GuangXiN  
       2020-07-22 12:44:17 +08:00 via Android
    .cpp 有两千行很长吗?我司一个.php 有 1980 行。
    yolee599
        15
    yolee599  
       2020-07-22 12:48:08 +08:00
    head1.h
    head2.h
    head3.h
    byzf
        16
    byzf  
       2020-07-22 17:08:13 +08:00   3
    所谓屎山叠加, 是把两千行复制一下, 然后在后面的两千行里改改, 变成四千行的文件, 这样换个人来维护代码, 就要在几十个长得几乎完全一样函数里找不同, 绝对维护不了.
    AlohaV2
        17
    AlohaV2  
    OP
       2020-07-22 17:09:04 +08:00 via iPhone
    @byzf 大哥你别说我真的发现一个很像很像的文件!!
    hahaayaoyaoyao
        18
    hahaayaoyaoyao  
       2020-07-22 20:17:55 +08:00 via Android
    @byzf 写个脚本查一下
    scukmh
        19
    scukmh  
       2020-07-22 20:41:11 +08:00
    我司一个.py 1300 行.(
    chinuno
        20
    chinuno  
       2020-07-23 08:49:00 +08:00 via Android
    @AlohaV2 https://docs.oracle.com/cd/E19205-01/821-0389/bkafk/index.html
    网上搜搜用法都有了。
    模板一般用法放头文件是使用的时候隐式实例化生成对应类的函数实现。
    显式实例化放 cpp 里面就提前指定了要实现函数内容,编译这个 cpp 的时候目标文件就包含了函数实现。这样就不需要引入头文件推迟到真正使用的时候才生成函数实现
    AlohaV2
        21
    AlohaV2  
    OP
       2020-07-23 09:15:05 +08:00
    @chinuno 我用到的场景应该是需要隐式实例化的,或者说是我提供了一个模板类,然后不同的编译目标都可能根据自己的需求去实例化它。这种情况下放在 cpp 应该是无法编译的吧,所以就有了我提出的问题。
    Wirbelwind
        22
    Wirbelwind  
       2020-07-23 10:58:17 +08:00
    我司 c++代码各种虚类,一个文件一个虚类,跳来跳去很麻烦。

    有些类型写得和 java 一样,还使用 DAO 命名的,然后 主设计开发者 去阿里当 p6 还是 p7 了
    sadfQED2
        23
    sadfQED2  
       2020-07-23 12:43:01 +08:00 via Android
    @GuangXiN 1980 行确定没少打个 0 ?我这里 19800 行的 php 代码一大把
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5077 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 09:31 PVG 17:31 LAX 01:31 JFK 04:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86