V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  ç™»å½•
AlohaV2
V2EX  â€º  C++

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

  •  
  •   AlohaV2 · 2020-07-21 19:59:33 +08:00 · 5065 次点击
    这是一个创建于 501 天前的主题,其中的信息可能已经有所发展或是发生改变。
    头文件里有很多宏+模板的代码,因为如此 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  
       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   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1065 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:47 · PVG 03:47 · LAX 11:47 · JFK 14:47
    ♥ Do have faith in what you're doing.