[英]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代碼中的名稱一無所知,並且您無法從編譯器訪問宏,因為編譯器對宏一無所知(在編譯器甚至沒有看到代碼之前就由預處理器進行了擴展)。
換句話說,編譯/執行分多個階段進行:
#include
或#define
類的指令,並擴展了宏)。 簡化示例:
// original C code
#define FOO 42
...
int x = y + FOO;
預處理后:
...
int x = y + 42;
編譯后:
movl %ecx, %eax
addl $42, %eax
在第2步中沒有FOO
痕跡,最終代碼對x
或y
一無所知。
諸如字符串之類的變量值僅在運行時的步驟3中存在。您無法從那里返回到步驟1。 如果要在運行時訪問有關宏的信息,則必須將其顯式保留在某種數據結構中,但這不是自動的。
宏是簡單的復制粘貼,並且非常有限。 如果宏被引用或注釋,則不會擴展。
一種解決方案是:
#define ABC "900"
char s[] = ABC;
但是不可以,宏不能用於您要嘗試執行的操作。
當我嘗試上面的代碼時,而不是我想要的輸出15,我得到6487568,我猜想該字符串的整數等效值。
這是未定義的行為。 最有可能是字符串的地址。 如果使用-Wall
編譯,則會收到警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.