C语言 指向#define的指针

wfsdck30  于 2023-10-16  发布在  其他
关注(0)|答案(5)|浏览(169)

我只是好奇,想知道是否有可能有一个指向#define常量的指针。如果是,我该如何做?

yrdbyhpb

yrdbyhpb1#

#define指令是指向preprocessor的指令,这意味着它在编译任何东西之前被预处理器调用。
因此,如果您键入:
#define NUMBER 100
然后你输入:
int x = NUMBER;
你的编译器实际上 * 看到 * 的只是:
int x = 100;
这基本上就像你在一个字处理器中打开了你的源代码,并做了一个查找/替换,把每个出现的“NUMBER”替换为“100”。所以你的编译器不知道NUMBER的存在。只有预编译预处理器知道NUMBER的含义。
所以,如果你试图获取NUMBER的地址,编译器会认为你试图获取一个整数常量的地址,这是无效的。

gfttwv5a

gfttwv5a2#

不可以,因为#define是用于文本替换的,所以它不是一个可以获取指针的变量。在代码被传递到编译器之前,你会看到它实际上被#define的定义所取代,所以没有任何东西可以获取地址。如果你需要一个常量的地址,定义一个const变量(C++)。
使用常量而不是宏通常被认为是一种好的做法,因为常量实际上表示变量,具有自己的作用域规则和数据类型。宏是全局的和无类型的,在大型程序中,它们很容易使读者感到困惑(因为读者看不到实际存在的内容)。

xjreopfe

xjreopfe3#

#define定义了一个宏。一个宏只会导致一个标记序列被另一个标记序列替换。指针和宏是完全不同的东西。
如果“#define constant”是指扩展为数值的宏,答案仍然是否定的,因为在任何地方使用宏时,它都会被该值替换。例如,无法获得指向数字42的指针。

ejk8hzay

ejk8hzay4#

有一种方法可以解决这个问题:

#define ROW 2

void foo()
{
    int tmpInt = ROW;
    int *rowPointer = &tmpInt;
    // ...
}

或者如果你知道它的类型,你甚至可以这样做:

void getDefinePointer(int * pointer)
{
    *pointer = ROW;
}

并使用它:

int rowPointer = NULL;
getDefinePointer(&rowPointer2);
printf("ROW==%d\n", rowPointer2);

你有一个指向 #define 常量的指针。

scyqe7ek

scyqe7ek5#

这在C/C++中是不可能的。
可以使用#define指令为程序中的常量给予一个有意义的名称。
我们可以以两种形式使用它。
请:查看此链接
http://msdn.microsoft.com/en-us/library/teas0593%28VS.80%29.aspx

define指令可以包含类似对象的定义或类似函数的定义。

抱歉,我不能再眨眼睛了...请参阅IBM链接.下面是我的链接链接。
你可以从上面的两个链接中获得完整的信息。

相关问题