| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 350 人关注过本帖
标题:不懂 info(s, arg...),四个问题
只看楼主 加入收藏
liaocao2014
Rank: 2
等 级:论坛游民
帖 子:16
专家分:14
注 册:2014-4-27
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:6 
不懂 info(s, arg...),四个问题
#include <stdio.h>
#define info(s, args...) printf(s, args)
#define debug(s, args...) fprintf(stderr, s, ##args)

int main(void)
{
    int a = 3, b = 5;
   
    info("a = %d, b = %d\n", a, b);

    debug("123456\n");

    return 0;
}

    运行输出的结果为
   
    a =3, b = 5
    123456

我这个是在linux下编译的
问题1:
    arg, args...分别是什么?
问题2:
    ##args是什么,在#define debug这个宏定义里,怎么后面有三个形参?
问题3:
    stderr与stdout的区别在哪里,什么情况下只能用stderr或者stdout?
问题4:
    arg这种知识点是在c语言的哪一部分,还能怎么用?(我百度都找不到)
搜索更多相关主题的帖子: linux return include 
2014-04-27 12:33
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:5 
可以看看C99的手册 6.10.3 Macro replacement 前两个我也说不好

问题3 stderr主要用于输出错误信息

问题4 百度找不到正常 可以看看C99的手册或者GCC的手册


2014-04-27 12:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
這種語法是可變參數,後面的省略號表示實參可以是個數不定、類型不定的參數,看看scanf()/printf()函數的用法就知道了。可變參數可以說是C語言“專用”的,之所以這樣說,是因爲C++雖然是C的超集、也支持可變參數,但已經不提倡使用了,在《C++ Primer》中,提到這個的時候,也祗是建議讀者回去看C的書,連多解釋幾句也不願。

你寫的這段代碼,是定義兩個宏,info宏其實是printf()的等價,debug也一樣是printf(),不過改為向標準錯誤設備stderr輸出數據,而printf()是向標準輸出設備stdout輸出的,當代碼使用這兩個不同宏的時候,編譯器分別把代碼實際替換成這樣兩個不同的輸出代碼,方便你調試程序。stderr一般來說與stdout是同一個設備,即都是控制臺輸出設備(顯示器),但兩者都可以修改設備,它們實際上一個文件句柄(FILE*),在控制臺命令行中,若把stderr修改為一個文件,則程序中所有向stderr輸出的語句,都改為向這個文件(設備)輸出——stdout亦然。這種用法的好處,是可以在程序編譯發行後,直接在控制臺命令行用指令修改標準設備,就把輸入輸出改變了方向,不用修改源代碼——需知修改C/C++程序是要重新編譯了才能運行的。

授人以渔,不授人以鱼。
2014-04-27 13:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
按照《C++ Primer》的解釋,可變參數實際上告訴編譯器取消對參數的類型檢查,帶來風險,它從根本上削弱了C語言的強類型特性,與語言的設計初衷相反,C有它的靈活性,可以這樣將就用,但C++的設計者並不希望削弱語言的強類型性質,而是要更加強這種性質,所以不提倡C++程序員使用這種語法,但因自稱向C兼容故不得不支持。不管你將來是否向C++遷移,可變參數實際上取消、暫停了編譯器對參數的類型檢查這一點,是必須要知道的,它有風險,看你是否値得去冒險,若論證過不怕,仍然是可以用的。

授人以渔,不授人以鱼。
2014-04-27 13:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
當stdout和stderr被設置为不同的設備時,信息的輸出是不同的。典型的用法,是正常的信息向stdout輸出,調試時的信息向stderr輸出,這樣後者不至影響前者的佈局,因爲兩種信息夾雜在一個畫面中,是很難區分的。

授人以渔,不授人以鱼。
2014-04-27 13:58
liaocao2014
Rank: 2
等 级:论坛游民
帖 子:16
专家分:14
注 册:2014-4-27
收藏
得分:0 
回复 2 楼 zklhp
万分感谢您的回复,好人一生平安
2014-04-27 14:21
liaocao2014
Rank: 2
等 级:论坛游民
帖 子:16
专家分:14
注 册:2014-4-27
收藏
得分:0 
回复 4 楼 TonyDeng
版主这一段的回答很好,有一种不仅让我知其然,而且知其所以然的感觉!
万分感谢!
版主是台湾的还是香港的啊,繁体字读起来还是有点费力的。
2014-04-27 14:28
快速回复:不懂 info(s, arg...),四个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014917 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved