簡體   English   中英

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

[英]Is it possible to get the address of a macro?

#define N 100

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

宏是已賦予名稱的代碼片段。 每當使用該名稱時,它將被宏的內容替換。

所以NO N不是變量,你不能得到N的地址

宏沒有任何地址,這就是為什么它們被稱為常量值。

宏是簡單的文本替換。 如果你寫代碼

int* ptr = &N;

然后它將被預處理成

int* ptr = &100;

100整數字面值 ,所有整數字面值都是常量rvalues,這意味着您無法為其賦值,也無法獲取其地址。

文字100當然存儲在內存中 - 你無法在空中分配數字 - 但它很可能存儲為已執行程序代碼的一部分。 在二進制文件中,您將有一些機器代碼指令看起來像“在指針變量的內存位置存儲100”,並且100存儲在該機器代碼指令中。 並且機器代碼指令的一部分是不可尋址的。

這是簡單的文本替換。 編譯器的預處理器將所有出現的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!"的情況下#define L "Hallo world!" 我們有一個字符串文字,編譯器確實放在內存中。 要求&L與要求&"Hallo world!" 這就是你得到的。

N 不是變量,它從來沒有任何地址。 當你使用像int val=N;這樣的模式時,它只是一個被粘貼的值int val=N; 然后你可以使用&獲取val的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM