g++下宏连接符对于数组不起作用

ufouser 2008-01-17 09:04:20

#define VAR(i) p ## i
#define ARR(i) p[ ## i ##]

int main()
{
{
int p2 = 6;
int q = VAR(2); // OK
}
{
int p[4];
p[2] = 6;
int q = ARR(2); // Error
}

return 0;
}



请问ARR宏该如何修改?
...全文
105 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ltc_mouse 2008-01-17
  • 打赏
  • 举报
回复
快乐接分~~

试了下,下面这么做也可以;就不用每个类型加一次初始化了。
template <class T>
X<T>* X<T>::x = NULL;
chlaws 2008-01-17
  • 打赏
  • 举报
回复

//我把过儿在2楼的程序补充下
#include<stdio.h>
#define paster( n ) printf( "token" #n " = %d", token##n )
#define definer1( n ) printf( "token" #n " = %d", tokenn )
#define definer2( n ) printf( "token" #n " = %d", token n )
"token" #n " = %d", 相当于"tokenn = %d", " #n " 相当于 n
int main()
{
int token8 = 100;
int tokenn=1; //tokenn要定义
paster( 8 );
definer1( 8 );
//definer2( 8 );//token n 定义不成一个变量所以definer2进不去。
return 0;
}
ufouser 2008-01-17
  • 打赏
  • 举报
回复
终于搞定了 散分:)


#include <iostream>
using namespace std;

template <class T>
class X
{
static X* x;
};

#define DDD(T) template <> \
X<T>* X<T>::x = NULL

DDD(int);

int main()
{
return 0;
}

ufouser 2008-01-17
  • 打赏
  • 举报
回复
我的目的是要实现这个模板类的静态成员的定义.
ufouser 2008-01-17
  • 打赏
  • 举报
回复

template <class T>
class X
{
static X* x;
};

//#define DDD(T) X<T>* X<T>::x = NULL
#define DDD(T) X< ## T ## >* X< ## T ## >::x = NULL

DDD(int);


上面的两个DDD定义在VC2005下都OK 在g++下都挂
ltc_mouse 2008-01-17
  • 打赏
  • 举报
回复
想不明白为什么lz在这里要连接符
连接符的用法fetag解释的很清楚了~

访问数组元素,这样就可以了吧:
#define ARR(i) p[(i)]
ufouser 2008-01-17
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
using namespace std;

#define SSSR(name) "name is " ## name
int main()
{
string str = SSSR("abc");
cout << str << endl;
return 0;
}

独孤过儿 2008-01-17
  • 打赏
  • 举报
回复
以上的回复是我copy过来的,不是我自己写的
独孤过儿 2008-01-17
  • 打赏
  • 举报
回复

#define paster( n ) printf( "token" #n " = %d", token##n )
#define definer1( n ) printf( "token" #n " = %d", tokenn )
#define definer2( n ) printf( "token" #n " = %d", token n )

main()
{
int token8 = 100;
paster( 8 );
definer1( 8 );
definer2( 8 );
}

gcc -E 可以看到预编译的结果
printf( "token" "8" " = %d", token8 ) ;
printf( "token" "8" " = %d", tokenn ) ;
printf( "token" "8" " = %d", token 8 ) ;

明白了吗?如果再编译的话definer1 definer2 的语句是会报错的
独孤过儿 2008-01-17
  • 打赏
  • 举报
回复
##的用法:##前后的形参将立刻被实参替换,其前后的符号合并形成新的符号,合并后##前后的所有空格都去除。

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧