簡體   English   中英

將變量的值傳遞給C中的宏

[英]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.

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