V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wheeler
V2EX  ›  C

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

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

    最近遇到一个奇怪的问题: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   ·   实用小工具   ·   5634 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 06:02 · PVG 14:02 · LAX 22:02 · JFK 01:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.