是否有可能获得宏的地址?

时间:2015-03-05 15:43:31

标签: c

#define N 100

&N不可能。我怎么知道N的地址?它必须有一些地址。

5 个答案:

答案 0 :(得分:5)

  

宏是代号的片段,它已被赋予名称。每当   使用该名称,它将被宏的内容替换。

所以否N不是变量,您无法获得N的地址

MACROS

答案 1 :(得分:3)

宏没有任何地址,这就是为什么它们被称为常量值。

答案 2 :(得分:3)

宏是简单的文本替换。如果您编写像

这样的代码
int* ptr = &N;

然后将其预处理为

int* ptr = &100;

100整数文字,所有整数文字都是常量右值,这意味着你不能为它赋值,也不能取其地址。

文字100当然存储在内存中 - 您无法在空中分配数字 - 但它很可能会存储为已执行程序代码的一部分。在二进制文件中,您将有一些机器代码指令看起来像"将100存储在指针变量的内存位置"并且100存储在该机器代码指令中。并且机器代码指令的一部分是不可寻址的。

答案 3 :(得分:2)

这是简单的文本替换。编译器的预处理器用N替换所有出现的100,但这取决于N是什么。在你的例子中,取一个常量的地址不会编译,但这两个其他的例子

#include <stdio.h>

#define N 100
#define M x
#define L "Hallo world!"

int main()
{
    int x = 42;
    //printf ("Address of 'N' is %p\n", (void*)&N);  // error C2101: '&' on constant
    printf ("Address of 'M' is %p\n", (void*)&M);
    printf ("Address of 'L' is %p\n", (void*)&L);
    return 0;
}

节目输出:

Address of 'M' is 0018FF3C
Address of 'L' is 0040C018

更多解释。

使用#define N 100,您无法获得N的地址,因为像这样的数字常量没有单个内存位置。可能会将100分配给变量的值,或者优化编译器可能会将100直接加载到处理器寄存器中。

如果#define M x是一个简单的替换,那么M可以完全用作x&x&M之间没有功能差异,因为在预处理器进行替换后,这两个语句是相同的。

#define L "Hallo world!"的情况下,我们有一个字符串文字,编译器 放在内存中。询问&L与询问&"Hallo world!"是一样的,这就是你得到的。

答案 4 :(得分:1)

N 不是变量,从不有任何地址。当您使用int val=N;等模式时,这只是一个值粘贴的值。然后,您可以使用val获取&的地址。