请教一个关于 C 语言注释的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wheeler
V2EX    C

请教一个关于 C 语言注释的问题

  •  
  •   wheeler 2019-06-14 22:07:14 +08:00 3380 次点击
    这是一个创建于 2316 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近遇到一个奇怪的问题:C 的代码库,给定文件和行号,要求在给定的行添加注释来做标记,注释的内容只包含字母和数字。要求不能改坏代码。

    在行末添加注释的话问题多多,暂时想到的方法就是在行的前面插入注释:/* comment0 */(虽然看起来比较奇怪)

    目前还没拿到代码,除了下面这种极端的情况,暂时没想到这样改会有什么问题,想听见大家的建议。

    preprocessor

    11 条回复    2019-06-17 14:52:08 +08:00
    secondwtq
        1
    secondwtq  
       2019-06-14 23:11:00 +08:00
    什么标记?为什么一定要用注释做?
    wheeler
        2
    wheeler  
    OP
       2019-06-14 23:18:10 +08:00
    @secondwtq 比如这行代码有问题,得安排人修复之类的。
    misaka19000
        3
    misaka19000  
       2019-06-14 23:23:05 +08:00
    把注释写到网页上面,在代码里面插超链接
    secondwtq
        4
    secondwtq  
       2019-06-14 23:23:08 +08:00   1
    @wheeler 我觉得 90% 情况下行尾注释可以解决问题,行首注释对我来说不可以接受,太丑了

    上面说的是单行的情况,你确定就不会有“这段代码有问题”的情况?

    我的意思是,可能需要更完善的机制来让这个东西变得更好用。而不是把选项限制在“行首注释”或者“行尾注释”中。比如上面说的语句块的问题,你可以在把语句块用两行注释 /* FIXME_BEGIN */ /* FIXME_END */ 包裹起来,或者定义一个叫 FIXME 的宏之类的
    youngxhui838
        5
    youngxhui838  
       2019-06-14 23:23:33 +08:00 via Android
    @wheeler todo ()
    wheeler
        6
    wheeler  
    OP
       2019-06-14 23:34:29 +08:00
    @secondwtq 感谢回复。目前只涉及单行的情况。

    行尾注释在遇到下面这种情况会有问题,虽然后期编译可以发现就是了。

    #include <stdio.h>

    int main(void)
    {
    printf("%s, %d, %d", "hello", \ /* hello */
    1, 2);

    return 0;
    }
    pkookp8
        7
    pkookp8  
       2019-06-15 02:42:14 +08:00 via Android
    #define TODOLIST 1
    #if TODOLIST comments #endif

    可以不
    junkman
        8
    junkman  
       2019-06-15 09:47:52 +08:00
    > C 的代码库,给定文件和行号,要求在给定的行添加注释来做标记,注释的内容只包含字母和数字。要求不能改坏代码。

    这个情况,在行前行尾添加注释都是不行的,因为多行连接的问题(\)会导致破坏代码正确性。

    为什么不换一种方式觉得这种问题呢?比如在一个单独的文件添加错误标注呢?

    或者说,这种错误标记可以在内存中停留吗,然后给到相应的处理程序?为什么一定要修改(侵略)文件呢?
    wheeler
        9
    wheeler  
    OP
       2019-06-15 10:22:58 +08:00 via iPhone
    @junkman 能说明下行首添加注释会有什么问题吗?

    嗯。其实这像是个 XY problem,其实我感兴趣的是这么做会不会有问题。
    GuangXiN
        10
    GuangXiN  
       2019-06-15 12:48:05 +08:00 via Android   1
    写这个库的人就没个 code review 系统么?
    junkman
        11
    junkman  
       2019-06-17 14:52:08 +08:00
    @wheeler 从词法分析的角度来看,在一个 statement 开头添加 /* Block comment */是没有问题的,如果你能保证你的标注程序只标注在一个 statement 的开始,按照现有的 C syntax。

    如果可能出现在一个 statement 的任意位置(比如中间位置),那么在出现多行连接的情况下,可能会产生诸如嵌套 /* Block comment */的问题,而大部分编译器是不支持嵌套 /* Block comment */的,因此这就导致无法编译通过。

    不过上面的例子过于吹毛求疵了,如果你只是想问可行性的话,我觉得大部分情况都是可行的,现有编译器在提示错误的时候,基本上报错也出现在 statement 开始所在的行。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2633 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 42ms UTC 12:21 PVG 20:21 LAX 05:21 JFK 08:21
    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