| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
大量收QQ微信精准粉/交友粉,非诚勿扰千里之行 始于足下
共有 486 人关注过本帖
标题:关于预编译器与编译器执行顺序的疑惑?
只看楼主 加入收藏
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:188
专家分:30
注 册:2014-10-9
结帖率:89.47%
  已结贴   问题点数:30  回复次数:9   
关于预编译器与编译器执行顺序的疑惑?
疑惑的程序代码如下:
程序代码:
#include <stdio.h>

#define PATH_3 https://www.baidu.com\
s?wd

int main()
{
    printf("%s\n","PATH_3");
    return 0;
}

   
首先说一下自己的理解吧:

1、由于程序的执行顺序是预编译器->编译器,预编译器执行时候,会将双引号中的 PATH_3 替换为 https://www.baidu.com\
然后编译器进行编译,所以打印结果应该是"PATH_3",但是打印结果却是"https://www.baidu.com\",这是为什么呢?我的
理解哪里出了差错呢?
2、同样,对于换行符\而言,预编译时候#define PATH_3 https://www.baidu.com\ 应该会将PATH_3以https://www.baidu.com\替换,
所以编译器工作时换行符\已经应该GG了,报错才对,但是结果却能正常工作,这是为什么呢?请大家解答一下。
2018-03-11 17:37
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:266
帖 子:5837
专家分:33355
注 册:2011-1-18
  得分:0 
没看懂你在说什么,gcc编译结果
prog.c:3:22: warning: multi-line comment [-Wcomment]
 #define PATH_3 https://www.baidu.com\
                      ^
运行结果
PATH_3
2018-03-11 18:40
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:188
专家分:30
注 册:2014-10-9
  得分:0 
回复 2楼 rjsp
也就是说预处理器咋没有给PATH宏替换成www.baidu.com...  不是预处理器先处理之后才进行编译器处理吗?

既然还有不甘心
就还没到放弃的时候~
2018-03-11 19:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:266
帖 子:5837
专家分:33355
注 册:2011-1-18
  得分:0 
回复 3楼 S140131022
可是你没有PATH_3呀,有的是"PATH_3"
2018-03-11 19:45
nslookup65
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:20
专家分:158
注 册:2017-12-1
  得分:0 
程序代码:

#include <stdio.h>

#define PATH_3 "https://www.baidu.com/"

int main()
{
    printf("%s\n", "PATH_3");
    printf("%s\n", PATH_3);
    return 0;
}
2018-03-11 20:58
my_lcs
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2018-3-12
  得分:0 
#include <stdio.h>

#define PATH_3 "https://www.baidu.com\\s?wd"

int main()
{
    printf("%s\n",PATH_3);
    return 0;
}
2018-03-12 16:02
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
  得分:0 
#include <stdio.h>

#define PATH_3 https://www.baidu.com\
s?wd

int main()
{
    printf("%s\n","PATH_3");//请注意,这是打印PATH_3这一字符串
    return 0;
}
printf("%s\n",PATH_3);//编译器会报错


普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2018-03-12 22:01
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:188
专家分:30
注 册:2014-10-9
  得分:0 
回复 2楼 rjsp
程序代码:
#include <stdio.h>

#define PATH_3 https://www.baidu.com

int main()
{
    printf("%s\n","PATH_3");
    return 0;
}
大哥,按照我的理解是这样的哈。
1、首先预处理器件处理,进行宏替换和头文件暂开,得到如下代码。
程序代码:
#include <stdio.h>
/* 下面已文件展开 */

int main()
{
    printf("%s\n","https://www.baidu.com");
    return 0;
}
2、所以打印的应该是字符串:https://www.baidu.com
请问大佬,我的理解错在哪里了呢?

既然还有不甘心
就还没到放弃的时候~
2018-03-13 10:06
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:266
帖 子:5837
专家分:33355
注 册:2011-1-18
  得分:30 
宏替换的是标识符
而 "PATH_3" 是个字符串字面量

简单的说 PATH_3会被替换,而"PATH_3"不会
2018-03-13 10:12
lwei
Rank: 5Rank: 5
等 级:职业侠客
帖 子:191
专家分:337
注 册:2005-5-4
  得分:0 
#include <stdio.h>

#define PATH_3 https://www.baidu.com

int main()
{
    printf("%s\n","PATH_3");   不加引号是宏定义,加了引号是字符串,所以打印PATH_3
    return 0;
}
printf("%s\n",PATH_3);//编译器会报错, 不报错才有问题,等于下面的语句
printf("%s\n", https://www.baidu.com);

#define PATH_3 "https://www.baidu.com"   改为这个样子就好了。


2018-03-13 15:38







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

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