-D名称=定义和按位运算符

时间:2019-02-18 11:41:38

标签: c gcc bitwise-operators bitflags

我试图了解如何进行下一次计算。

例如,如果这是我的终端命令

gcc ex2.c -D b+=2

为什么我要5?

#include <stdio.h>

int main() 
{
#ifdef b
    printf("%d\n", 2 b | ~ 2 b);
#endif
    return 0;
}

2 b表示2 * b吗?

〜2 b表示2 * b,然后〜?

2 个答案:

答案 0 :(得分:7)

这很奇怪,它在解析命令行参数时看起来像gccclang中的错误(或功能)。

类似gcc的宏声明中的第一个=符号用空格代替。所以参数:

-D b+=2

等于

#define b+ 2

因为gcc具有这样的扩展名,所以它等于

#define b + 2

使预处理器输出:

printf("%d\n", 2 + 2 | ~ 2 + 2);

表达式2 + 2 | ~ 2 + 2等于(2 + 2) | ((~ 2) + 2)(请参阅operator precedence),表达式在twos complement系统上等于4 | (-3 + 2),它等于{{1} }。在二进制补码中,4 | -1等于-1,所以0xff....ff等于4 | -1的{​​{1}}(因为它是二进制OR)。

答案 1 :(得分:4)

使用RestTemplate restTemplate = new RestTemplate( new SimpleClientHttpRequestFactory(){ @Override protected void prepareConnection( HttpURLConnection connection, String httpMethod ) { connection.setInstanceFollowRedirects(false); } } ); ResponseEntity<Object> response = restTemplate.exchange( "url", HttpMethod.GET, null, Object.class ); int statusCode = response.getStatusCodeValue(); String location = response.getHeaders().getLocation() == null ? "" : response.getHeaders().getLocation().toString(); 进行编译将 b 定义为gcc ex2.c -D b+=2,因此源代码

+2

就像

#include <stdio.h>

int main() 
{
#ifdef b
    printf("%d\n", 2 b | ~ 2 b);
#endif
    return 0;
}

为我打印#include <stdio.h> int main() { printf("%d\n", 2 + 2 | ~ 2 + 2); return 0; }


要查看预处理后的结果,请使用-E选项:

-1