福尔摩斯 发表于 2009-12-14 20:24:39

问一个基础问题。。。C/C++

我不记得在哪里见过 ## 这样的使用方法

我学过C/C++, 但是我还没见过这种方法, 请问有谁见过?是什么意思?如何使用?

也就是 俩个 # 连在一起使用。。。

nihui 发表于 2009-12-14 20:41:34

字符串粘贴宏

#define JOIN(A,B) A##_is_not_##B
JOIN(xxx,yyy) 会被预处理为 xxx_is_not_yyy

zy_sunshine 发表于 2009-12-14 22:12:41

给个实例?

在字符串中的宏不会被预处理,除了在字符串中用这个还可以在哪种情况用?

nihui 发表于 2009-12-14 22:55:18

就是把两段字粘贴在一块,只能是预处理而已,并不能运行时连接的(如果要实现这个的话,个人觉得得用 c++ 的 template 和运算符重载),所有的字符都是在编译阶段都是可知的,省点写代码的功夫罢了。。一点意思也没有,用得太多会让代码变得很不可理解,比如 国际C语言混乱代码大赛 里的作品有些就是大量的 ## ................

A1##2   -->   A12
abc##345    -->   abc345

zy_sunshine 发表于 2009-12-14 23:07:57

回复 4# nihui 的帖子

恩,都有印象,但是记不住了,学习了

是因为我的基础没打好呢,还是教育的问题,反思中......:x

福尔摩斯 发表于 2009-12-15 17:28:49

原帖由 nihui 于 2009-12-14 22:55 发表 http://www.linuxfans.org/bbs/images/common/back.gif
就是把两段字粘贴在一块,只能是预处理而已,并不能运行时连接的(如果要实现这个的话,个人觉得得用 c++ 的 template 和运算符重载),所有的字符都是在编译阶段都是可知的,省点写代码的功夫罢了。。一点意思也没有,用得太多会 ...
应该是乱码大赛的, 我不记得怎么用了
因为这个东西我一直没用过:twisted: :oops:

PS:我IDE C++Free 3。5

运行如下代码:#include<stdio.h>
#define P##S printf("Hello\n")
int main(void)
{
    PS;
}发生一个错误:
:'##' at start of macro definition

[ 本帖最后由 福尔摩斯 于 2009-12-15 17:42 编辑 ]

福尔摩斯 发表于 2009-12-15 18:04:19

另:C语言乱码大赛经典之作#include <stdio.h>
char *a;main(int t,int _,char* a){return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:t<-50?_==*a?putchar(31):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
:0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}这里的## 不是在预处理里的。。。

whistler_wmz 发表于 2009-12-15 19:05:38

whistler_wmz 发表于 2009-12-15 19:06:27

whistler_wmz 发表于 2009-12-15 19:06:48

福尔摩斯 发表于 2009-12-15 19:18:34

原帖由 whistler_wmz 于 2009-12-15 19:05 发表 http://www.linuxfans.org/bbs/images/common/back.gif
2 楼正解
能不能给出一个具体代码。。。
页: [1]
查看完整版本: 问一个基础问题。。。C/C++