注册 登录
编程论坛 VFP论坛

VFP:多行注释的尴尬!

cssnet 发布于 2022-04-26 17:01, 2966 次点击
VFP没有多行注释符:

/*
------------
1行注释
2行注释
3行注释
------------
*/

感觉挺别扭的。
事关,习惯分段式调试:一段代码搞掂了,就注释掉,接着集中去搞另一段。
而VFP中只能这样子多行注释:

if .f.
*------------
1行注释
2行注释
3行注释
*------------
endif .f.

这倒不是问题,勉强也能接受;可问题是,这样子注释掉多行代码,却仍必须保证if .f. ~ endif .f.之间的代码没有语法错误,因VFP仍是会编译这一段代码的。
注释仍要讲究语法正确,这也太太太太强人所难了吧?
呵呵。


[此贴子已经被作者于2022-4-26 17:03编辑过]

23 回复
#2
laowan0012022-04-26 18:06
text to 不检查语法

既然是一段调试过的代码注释掉,怎么会有语法问题呢???
#3
ljlhpop2022-04-26 18:35
选中多行,,点右键注释,,不香吗?
#4
sdta2022-04-26 19:14
note 不行吗
#5
吹水佬2022-04-26 19:16
可用编译命令
#if 0
*------------
1行注释
2行注释
3行注释
*------------
#endif
#6
sostemp2022-04-26 19:31
note 1行注释;
2行注释;
3行注释

[此贴子已经被作者于2022-4-26 19:32编辑过]

#7
laowan0012022-04-26 20:18
我的习惯是:
如果是单行就在开始写*或&&
如果是多行,就用if 1=2 ... endif括越来,需要的时候把1=2改成1=1就能用了
#8
吹水佬2022-04-26 20:42
if .f. 还是有效编译的代码
#if .f. 不会被编译的代码
#9
cssnet2022-04-26 21:42
以下是引用吹水佬在2022-4-26 20:42:47的发言:
if .f. 还是有效编译的代码
#if .f. 不会被编译的代码


哈哈!感谢吹版!又学到一招!
其他多行注释的方式都没这个方便,主要原因是:
多行注释必须能够保证:在任何时候,只要有需要,“一键”就能迅速将临时注释掉的多行代码还原回去。比方说,在每一行首加*,或每一行尾加;之类,那都是没法还原的。那不成,自己给自己下套,一不小心就会埋雷,且以后很难发现了!
#10
my23182022-04-26 22:20
选中要注释的内容,用菜单里的注释命令加注释符号,选中注释用菜单的反注释解除注释不好吗?
#11
cssnet2022-04-26 23:24
以下是引用my2318在2022-4-26 22:20:43的发言:
选中要注释的内容,用菜单里的注释命令加注释符号,选中注释用菜单的反注释解除注释不好吗?

确实不太习惯每一行都加注释符*!*
嗯……怎么说呢,多行注释后的代码,随时仍可能会编辑、随时恢复运行的,万一误碰到*!*,比如不小心将某一行首改成了*!,后果就难以预料啦。
#12
hu9jj2022-04-27 08:03
拿现在的使用习惯去要求十多年前的软件产品,当然会觉得有许多不满意的。
#13
csyx2022-04-27 13:56
选中多行,Ctrl+O+M 注释,Ctrl+O+N 反注释,没觉得什么不方便的,习惯就好
#14
cssnet2022-04-27 16:15
确实只是一个习惯问题,呵呵,习惯就好!

随便拿一段吹版的代码做例子:

* ----------源程序--------------
FUNCTION load_data(filename)
    IF !FILE(filename)
        RETURN 0
    ENDIF
    LOCAL fp, ptr
    fp = myFOpen(filename, "rb")
    IF  fp == 0
        RETURN 0
    ENDIF
    head = 0
    last = 0
    IF apiFRead(pBuffer,bufSize,1,fp) == 1
        head = dt.create()
        apiMemcpy_s(head, bufSize, pBuffer, bufSize)
        dt.setValue("next", 0, head)
        last = head
    ENDIF
    DO WHILE apiFRead(pBuffer,bufSize,1,fp) == 1
        ptr = dt.create()
        apiMemcpy_s(ptr, bufSize, pBuffer, bufSize)
        dt.setValue("next", 0, ptr)
        dt.setValue("next", ptr, last)
        last = ptr
    ENDDO
    apiFClose(fp)
    RETURN head
ENDFUNC

* ----------临时注释掉一段程序--------------
FUNCTION load_data(filename)
    IF !FILE(filename)
        RETURN 0
    ENDIF
    LOCAL fp, ptr
    fp = myFOpen(filename, "rb")
    IF  fp == 0
        RETURN 0
    ENDIF
    head = 0
    last = 0
    IF apiFRead(pBuffer,bufSize,1,fp) == 1
        head = dt.create()
        apiMemcpy_s(head, bufSize, pBuffer, bufSize)
        dt.setValue("next", 0, head)
        last = head
    ENDIF
#if .f. &&-------------暂时跳过以下循环-------------
    DO WHILE apiFRead(pBuffer,bufSize,1,fp) == 1
        ptr = dt.create()
        apiMemcpy_s(ptr, bufSize, pBuffer, bufSize)
        dt.setValue("next", 0, ptr)
        dt.setValue("next", ptr, last)
        last = ptr
    ENDDO
#endif .f. &&-------------暂时跳过以上循环-------------
    apiFClose(fp)
    RETURN head
ENDFUNC

* ------------------------------------------------
* 若随时想要取消注释,只需将#if .f. 和#endif .f.这两行的行首#换成*即可
* 亲,不香吗?
* ------------------------------------------------
#15
cssnet2022-05-01 07:51
其实还有最尴尬的一点:

VFP的代码编辑器已是十几年前的了,并不好用,甚至可以说很不友好,除了一些表单与可视化类库,我极少在IDE中写代码,一般会用Editplus、EmEditor、UltraEdit之类写prg,甚至表单和类库都在EP、EM、UE中写局部代码——因VFP没法进行版本跟踪比较,想汇总比较一下Ver 2.03与Ver 2.02的代码差异,还得统统转化为纯文本文件,用最原始的文本比较工具,如UltraCompare之类来作对比,作统计。

你让我在Editplus中,怎么方便地添加多行注释?——那肯定是类C风格的多行注释最方便啦!亲。
#16
talkrobin2022-05-15 10:57
注释方法 的分享非常不错,感谢
#17
foxfans2022-05-15 14:22
方法多种多样,符合规则即可,以下代码会影响运行效率。

#DEFINE _s text to _nop noshow
#DEFINE _o endtext

_s
 sss
 ssdfds
 dsfs
_o


FOR i=1 TO 10
?i
ENDFOR

_s
随便写点东西吧
*!*.sdf.sdfsdfsd
'sdfasdlfjldsajfadslf
_ssdaf;dsflfsad
sdafs
&&
_o

FOR i=1 TO 5
 ?TRANSFORM(i)
ENDFOR

[此贴子已经被作者于2022-5-15 14:31编辑过]

#18
cssnet2022-05-15 17:29
以下是引用foxfans在2022-5-15 14:22:22的发言:
方法多种多样,符合规则即可,以下代码会影响运行效率。
#DEFINE _s text to _nop noshow
#DEFINE _o endtext

_s
 sss
 ssdfds
 dsfs
_o
...


还挺有趣的!
不过有些尴尬的是:
1、自定义的“_s / _o”,别人一眼看不懂;
2、有没考虑过,若真这么干的话,就必须在每一个文件头都得添加#DEFINE或#INCLUDE,难道,你不嫌麻烦么?
呵呵。

单就代码简洁优雅方面考量,个人感觉,吹版的建议最佳!

#if .f.
   *--------------
   巴拉巴拉
   叽哩呱啦
   阿吱阿咗
   九唔搭八
   ……
   *--------------
#endif .f.
#19
foxfans2022-05-15 19:08
主程序加一个即可,其它地方要引用,可以做个文件来#include包含进去,也没什么难的。 用自带的右键选中还是最方便。
只能怪Vfp没有后续更新,新的特性IDE不支持。
#if 0
#endif 0
如果支持另外的宏定义 把 #if 0 定成/* 另一个为 */也许就类似HTML语法,不过也没啥必要。

[此贴子已经被作者于2022-5-15 19:50编辑过]

#20
laowan0012022-05-15 20:12
没想到一个注释会有这些纠结
*/&&做单行注释
if .f.//endif多行注释,需要的时候把.f.改成.t.即可
如果是两段代码做比较if .f./else/endif正好可以满足要求
这样不香吗?
#21
foxfans2022-05-15 20:28
*!* && *
#if .f.(或#if 0) 和 if .f. 是不一样的,把调试模式关掉,编译,前者是不会编译到项目中。这就是运行效率的问题。
#if _WIN64  _WIN32 类似C++判断是否为64位程序,按需编译(预编译).

[此贴子已经被作者于2022-5-15 20:30编辑过]

#22
laowan0012022-05-15 21:29
既然是调试,那通常会在开发环境做,编译成EXE应该是已经确定了方案,也就没必要保留调试程序了

另:#if确实不会编译到项目中,然,效率能有多大差别?
#23
foxfans2022-05-15 22:37
编译调试模式和你说的调试二个不同概念
#if .f. (0) 预编译判断后不会将假的相应代码编译进去更不会执行,不编译到项目中,效率自然高上很多,只有作者知道。
do while .t.
 #if 0
  ?"a"
 #endif 0
enddo
上面编译后等价于
do while .t.
enddo

而if endif是老实的运行判断
do while .t.
  if .f.
  endif
enddo
效率十万八千里。可以简单测试

t=SECONDS()
n=1
do while n<50000000
  #if 0
  #endif 0
  n=n+1
enddo
?SECONDS()-t
 
t=SECONDS()
n=1
do while n<50000000
  if .f.
  endif
  n=n+1
ENDDO
?SECONDS()-t

[此贴子已经被作者于2022-5-15 22:54编辑过]

#24
laowan0012022-05-16 08:43
学习了实例,汇报如下
前半部分程序,运行了很久都没测出时间来,不知何故,只能强制中断
后半部分程序执行结果是:7.166和8.341,效率果然差距很大
1