c语言的作用:和#的区别及作用

&>&c语言中的#号和##号的作用
c语言中的#号和##号的作用
上传大小:40KB
在C语言设计,要用到#和##,但详细论述起作用,并提供实例的文章很少。该文详细介绍了#和##的用途,并通过实例进行了演示
综合评分:0
下载个数:
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有0条
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
c语言中的#号和##号的作用
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
c语言中的#号和##号的作用> 博客详情
在宏定义中#和##的作用是:前者将宏定义的变量转化为字符串;后者将其前后的两个宏定义中的两个变量无缝拼接在一起转化为字符串。
1. & #: 在宏定义中,将其后的变量,转化为字符串。
& & eg: &#define &str(s) & & &#s
& 输出: helloworld , 就可以通过这样的的调用, printf( str(helloworld) );
2. ## : 在宏定义中,将其前后的两个变量拼接在一起。
& & &eg: #define v(a,b,c,d) & & & 0xa##b##c##d & & & & & &&
& & &//将四个字节的十六进制的数据转化为一个十六进制的整型数据
& & int & &a &= &v(CF,AB,B0,BC); &&// 即 a = 0xCFABB0BC
3. 两者的共性: 能够阻止宏定义的递归展开。可以通过中间的转换的宏,来实现参数宏的展开。
测试例子:
#include &stdio.h&
#include &stdlib.h&
#include &unistd.h&
#define ROOT "/mnt/sd/"
#define NAME "kernel.img"
#define path(dir,name) dir##name
#define print(format,args...) printf(format,##args)
#define test(name) #name
int main(int argc, char *argv[])
//printf("macro PATH = %s\n", PATH);
//printf("path(dir,name) = %s\n", path(ROOT,NAME));
printf("path(dir,name) = %s\n", path(RO,OT));
//printf("macro TEST = %s\n", TEST);
printf("test(name) = %s\n", test(NAME));
printf("test(MON) = %s\n", test(MON));
//printf("#MON = %s\n", #MON);
print("%s%s\n", ROOT,NAME);
测试结果:
~/test$ ./macro_sign
path(dir,name) = /mnt/sd/
test(name) = NAME
#宏不会递归展开
test(MON) = MON
#可以很方便地实现枚举变量的字符串显示
/mnt/sd/kernel.img
# ##符号的特殊用法
使用#和##宏符号的作用定义最简单的日志接口,如下:
#define SLOG(level,format,args...) \
do{printf("[%s]",#level);printf(format,##args);}while(0)
SLOG(ERR,"%s",strerror(errno); // 调用方式,不需要定义ERR宏,接口会自动打印为字符串 这个宏可以很方便地替换在项目中使用的正式日志接口,用来保持模块的独立性,便于模块的测试。
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥C语言中a++与++a的区别是什么?详细一点,谢谢!_百度知道
C语言中a++与++a的区别是什么?详细一点,谢谢!
我有更好的答案
a++ 是先返回a的值,再执行++运算。++a 是先执行++运算,在返回a的值。例如:#include &stdio.h&int main(){
a = 5; //此时 a的值是5
b = a++; //这一步,a一开始为5, 先返回a的值给b,b就为5了,然后 a执行++,a就为6了。
printf(&a = %d, b = %d \n&, a, b); //输出 a = 6, b = 5
c = ++a; //这一步, a先执行++,a的值就为7了,然后再将a的值返回给c,c也等于7了。
printf (&a = %d, c = %d \n&, a, c); //输出 a = 7, c = 7return 0;}
采纳率:39%
a++代表先取值,后运算。++a代表先运算,后取值。a=1;如b = a++;得b = 1若b = ++a;得b = 2
一个用了再加1,一个先加一再用
为您推荐:
其他类似问题
c语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。温馨提示:糗事百科为大家收集了很多的c语言中%c和%s的区别的糗事,各种关于c语言中%c和%s的区别的爆笑经历,尴尬时刻和开心视频,想持续关注c语言中%c和%s的区别的糗事就收藏本页吧。
扫码下载糗事百科app博客访问: 720723
博文数量: 107
博客积分: 110
博客等级: 民兵
技术积分: 1842
注册时间:
分类: C/C++ 18:04:15
一、一般用法
我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.
#i nclude
#i nclude
#define STR(s)&&&&& #s
#define CONS(a,b)&& int(a##e##b)
int main()
&&&& printf(STR(vck));&&&&&&&&&&& // 输出字符串"vck"
&&&& printf("%d\n", CONS(2,3));&& // 2e3 输出:2000
&&&& return 0;
二、当宏参数是另一个宏的时候
需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开.
1, 非'#'和'##'的情况
#define TOW&&&&&& (2)
#define MUL(a,b) (a*b)
printf("%d*%d=%d\n", TOW, TOW, MUL(TOW,TOW));
这行的宏会被展开为:
printf("%d*%d=%d\n", (2), (2), ((2)*(2)));
MUL里的参数TOW会被展开为(2).
2, 当有'#'或'##'的时候
#define A&&&&&&&&&& (2)
#define STR(s)&&&&& #s
#define CONS(a,b)&& int(a##e##b)
printf("int max: %s\n",&& STR(INT_MAX));&&&& // INT_MAX #i nclude
这行会被展开为:
printf("int max: %s\n", "INT_MAX");
printf("%s\n", CONS(A, A));&&&&&&&&&&&&&&& // compile error&&
这一行则是:
printf("%s\n", int(AeA));
INT_MAX和A都不会再被展开, 然而解决这个问题的方法很简单. 加多一层中间转换宏.
加这层宏的用意是把所有宏的参数在这层里全部展开, 那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数.
#define A&&&&&&&&&&& (2)
#define _STR(s)&&&&& #s
#define STR(s)&&&&&& _STR(s)&&&&&&&&&& // 转换宏
#define _CONS(a,b)&& int(a##e##b)
#define CONS(a,b)&&& _CONS(a,b)&&&&&&& // 转换宏
printf("int max: %s\n", STR(INT_MAX));&&&&&&&&&& // INT_MAX,int型的最大值,为一个变量 #i nclude
输出为: int max: 0x7fffffff
STR(INT_MAX) -->&& _STR(0x7fffffff) 然后再转换成字符串;
printf("%d\n", CONS(A, A));
输出为:200
CONS(A, A)&& -->&& _CONS((2), (2))&& --> int((2)e(2))
三、'#'和'##'的一些应用特例
1、合并匿名变量名
#define&& ___ANONYMOUS1(type, var, line)&& type&& var##line
#define&& __ANONYMOUS0(type, line)&& ___ANONYMOUS1(type, _anonymous, line)
#define&& ANONYMOUS(type)&& __ANONYMOUS0(type, __LINE__)
例:ANONYMOUS(static int);&& 即: static int _anonymous70;&& 70表示该行行号;
第一层:ANONYMOUS(static int);&& -->&& __ANONYMOUS0(static int, __LINE__);
第二层:&&&&&&&&&&&&&&&&&&&&&&&& -->&& ___ANONYMOUS1(static int, _anonymous, 70);
第三层:&&&&&&&&&&&&&&&&&&&&&&&& -->&& static int&& _anonymous70;
即每次只能解开当前层的宏,所以__LINE__在第二层才能被解开;
2、填充结构
#define&& FILL(a)&&& {a, #a}
enum IDD{OPEN, CLOSE};
typedef struct MSG{
&& const char *
MSG _msg[] = {FILL(OPEN), FILL(CLOSE)};
MSG _msg[] = {{OPEN, "OPEN"},
&&&&&&&&&&&&&& {CLOSE, "CLOSE"}};
3、记录文件名
#define&& _GET_FILE_NAME(f)&&& #f
#define&& GET_FILE_NAME(f)&&&& _GET_FILE_NAME(f)
static char&& FILE_NAME[] = GET_FILE_NAME(__FILE__);
4、得到一个数值类型所对应的字符串缓冲大小
#define&& _TYPE_BUF_SIZE(type)&& sizeof #type
#define&& TYPE_BUF_SIZE(type)&&& _TYPE_BUF_SIZE(type)
char&& buf[TYPE_BUF_SIZE(INT_MAX)];
&&&&& -->&& char&& buf[_TYPE_BUF_SIZE(0x7fffffff)];
&&&&& -->&& char&& buf[sizeof "0x7fffffff"];
这里相当于:
char&& buf[11];
【alps_008】:
基本看了一遍,楼主的情况属于一般用法:
“#把宏参数变为一个字符串,用##把两个宏参数贴合在一起”
#define STRCPY(a,b) strcpy(a##_p,#b)&&& //把第一个参数后边加上字符_p,把第二个参数变成字符串
int main()
char var1_p[20];
char var2_p[30];
strcpy(var1_p,"aaaa");
strcpy(var2_p,"bbbb");
&&&&&&&&& STRCPY(var1,var2);&&&&&&&&&&&& //等于strcpy(var1_p,"var2");
STRCPY(var2,var1);&&&&&&&&&&&& //等于strcpy(var2_p,"var1");
printf("%s\n",var1_p);
printf("%s\n",var2_p);
【jeffer007】:
Token-Pasting Operator (##)
// preprocessor_token_pasting.cpp
#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;
int main()
&&& paster(9);
token9 = 9
Stringizing Operator (#)
// stringizer.cpp
#define stringer( x ) printf( #x "\n" )
int main() {
&&& stringer( In quotes in the printf function call );
&&& stringer( "In quotes when printed to the screen" );&&&
&&& stringer( "This: \"&& prints an escaped double quote" );
In quotes in the printf function call
"In quotes when printed to the screen"
"This: \"&& prints an escaped double quote"
出处:http://blog.csdn.net/firetaker/article/details/7381345
阅读(18811) | 评论(1) | 转发(5) |
给主人留下些什么吧!~~
写的很全面,学习了~~
请登录后评论。}

我要回帖

更多关于 c语言static的作用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信