指向#define的指针

问题描述 投票:0回答:5

我只是想知道是否可以有一个引用 #define 常量的指针。如果是的话我该怎么做?

c c-preprocessor
5个回答
13
投票

#define
指令是针对预处理器的指令,这意味着它在编译任何内容之前由预处理器调用。

因此,如果您输入:

#define NUMBER 100

然后输入:

int x = NUMBER;

你的编译器实际上看到的很简单:

int x = 100;

基本上就像您在文字处理程序中打开源代码并进行查找/替换以将每个出现的“NUMBER”替换为“100”。所以你的编译器不知道

NUMBER
的存在。只有预编译预处理器知道
NUMBER
的含义。

因此,如果您尝试获取

NUMBER
的地址,编译器会认为您正在尝试获取整数常量的地址,这是无效的。


12
投票

不,因为

#define
用于文本替换,所以它不是一个可以获取指针的变量。在代码传递给编译器之前,您会看到它实际上被
#define
的定义替换,因此没有任何内容可以获取地址。如果您需要常量的地址,请定义一个
const
变量 (C++)。

使用常量而不是宏通常被认为是良好的做法,因为它们实际上代表变量,具有自己的作用域规则和数据类型。宏是全局的、无类型的,在大型程序中,它们很容易使读者感到困惑(因为读者看不到实际存在的内容)。


3
投票

#define
定义宏。宏只会导致一个标记序列被不同的标记序列替换。指针和宏是完全不同的东西。

如果“

#define
常量”指的是扩展为数值的宏,那么答案仍然是否定的,因为在任何使用宏的地方,它都会被该值替换。例如,无法获取指向数字
42
的指针。


0
投票

不,这在 C/C++ 中是不可能的

您可以使用#define指令为程序中的常量指定一个有意义的名称

我们可以以两种形式使用。

请:请参阅此链接

http://msdn.microsoft.com/en-us/library/teas0593%28VS.80%29.aspx

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

我很抱歉我无法再提供一个眨眼...请参阅 IBM 链接..因为下面我粘贴了链接

您可以从以上两个链接获取完整信息


0
投票

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

#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 常量的指针。

© www.soinside.com 2019 - 2024. All rights reserved.