簡體   English   中英

我可以使用字符串作為宏在C中傳遞該宏的值嗎?

[英]Can I use a string as a macro to pass the value of that macro in C?

我試圖實現C將我的字符串解釋為宏。

嘿,我們假設有一個已定義的宏,

#define ABC 900

如果我定義;

char* s[] = "ABC" ; 

然后,

printf("%d",s) ; 

編譯器有什么辦法將“ ABC”理解為宏ABC並將900整數值傳遞給printf?

#include<stdio.h>
#define abc 15

int main(void) {

    char a[] = "abc" ;

    printf("%d",a); 


    return 0;
}

當我嘗試上面的代碼時,而不是我想要的輸出15,我得到6487568,我猜想該字符串的整數等效值。

編輯:這些是隨機值,或字符串的地址。 (如下文所述)

不,您要嘗試做的事是不可能的。 您無法在運行時按名稱訪問變量(字符串->變量),因為已編譯的機器代碼對C代碼中的名稱一無所知,並且您無法從編譯器訪問宏,因為編譯器對宏一無所知(在編譯器甚至沒有看到代碼之前就由預處理器進行了擴展)。

換句話說,編譯/執行分多個階段進行:

  1. C源代碼經過預處理(擺脫了諸如#include#define類的指令,並擴展了宏)。
  2. 預處理的令牌流將傳遞給編譯器,編譯器將其轉換為機器代碼(可運行程序)。
  3. 最終程序運行。

簡化示例:

// original C code
#define FOO 42
...
int x = y + FOO;

預處理后:

...
int x = y + 42;

編譯后:

movl %ecx, %eax
addl $42, %eax

在第2步中沒有FOO痕跡,最終代碼對xy一無所知。

諸如字符串之類的變量值僅在運行時的步驟3中存在。您無法從那里返回到步驟1。 如果要在運行時訪問有關宏的信息,則必須將其顯式保留在某種數據結構中,但這不是自動的。

宏是簡單的復制粘貼,並且非常有限。 如果宏被引用或注釋,則不會擴展。

一種解決方案是:

#define ABC "900"
char s[] = ABC; 

但是不可以,宏不能用於您要嘗試執行的操作。

當我嘗試上面的代碼時,而不是我想要的輸出15,我得到6487568,我猜想該字符串的整數等效值。

這是未定義的行為。 最有可能是字符串的地址。 如果使用-Wall編譯,則會收到警告。

暫無
暫無

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

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