[英]Passing the value of a variable to macro in C
我正在嘗試將變量的值傳遞給C中的宏,但是我不知道這是否可行。 例:
#include <stdio.h>
#define CONCVAR(_n) x ## _n
int main () {
int x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
int i;
for (i = 0; i <= 9; i++) CONCVAR(i) = i*5;
return 0;
}
在這里,我正在嘗試使用##
令牌使用宏為所有x_變量分配值。 我知道我可以使用數組輕松實現這一點,但這僅出於學習目的。
CONCVAR(i)
替換為xi
,而不是x1
(如果i == 1)。 我知道定義和宏的工作方式,這全都與替換有關,但是我想知道是否可以將i的值而不是字母i
傳遞給宏。
將i
的值替換為宏是不可能的,因為在代碼編譯之前就進行了宏替換。 如果您使用的是GCC,則可以通過添加'-E'命令行參數來查看預處理器的輸出(但是請注意,您將在代碼中看到所有#include插入的內容。)
C是一種靜態語言,您無法在運行時確定符號名稱。 但是,如果您使用數組並使用下標引用元素,則您可能想要實現的目標。 根據經驗,如果您有許多變量,例如x0,x1等,則可能應該使用像數組這樣的容器。
不,因為i
的值僅在運行時存在。 宏擴展發生在編譯時 。
不,這行不通。 C / C ++預處理器就是這樣一個“預編譯”時間文本處理器。 這樣,它就可以在源代碼中按原樣查找文本。
這就是為什么它需要文字文本“ i”,並將其傳遞到宏中,然后將其擴展為源代碼中的文字文本“ xi”。 然后將其傳遞給編譯器。 然后,編譯器開始解析后處理的文本,找到文字標記“ xi”作為未聲明的變量,從而使處理過程逐漸繁瑣。
您可以獲取示例源代碼,然后將其傳遞給gcc編譯器(例如,我在cygwin下使用gcc,由於缺少更好的名稱,因此將代碼粘貼到名為pimp.c的文件中)。 然后您將獲得以下內容:
$ gcc pimp.c
pimp.c: In function `main':
pimp.c:9: error: `xi' undeclared (first use in this function)
pimp.c:9: error: (Each undeclared identifier is reported only once
pimp.c:9: error: for each function it appears in.)
簡而言之,不,您不能那樣做。 為了能夠做到這一點,預處理器將不得不充當解釋器。 C和C ++(通常)不是解釋語言,並且預處理器也不是解釋器。 我的建議是弄清楚編譯器和解釋器之間(以及編譯和解釋語言之間)的區別。
問候。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.