簡體   English   中英

立即復制宏中的文本

[英]Immediate duplication of text in macros

這將打印“foo\nbar\n”。

#include <stdio.h>

int main(void) {
#define STRINGX(a) #a
#define STRING(a) STRINGX(a)
#define FOO foo
#define FOO_STR STRING(FOO)
    printf("%s\n", FOO_STR);
#undef FOO
#define FOO bar
    printf("%s\n", FOO_STR);
    return 0;
}

但是,假設我想保存FOO_STR的定義,而不管后續的重新定義,“foo\nfoo\n”? 是否有可能在定義的地方立即獲得 的宏展開?

編輯:我想這樣做的原因是我有一個 header 我包含多次,將宏作為 arguments 傳遞; 如果我在第一次包含FOO時可以復制它,它將簡化測試。

那是不可能的。 C預處理器沒有“立即擴展”的概念。 宏定義在使用之前永遠不會擴展,因此除了擴展宏之外,沒有辦法“保存”宏的當前值:

static const char* foo_old_val = FOO_STR;
#undef FOO
#define FOO bar
printf("%s\n", foo_old_val);

你犯了一個非常重要的錯誤。 宏被文本擴展和文本(實際上在令牌級別)替換。 預處理器不理解 C 語言。

像函數這樣的宏不是函數,也不是“執行”的。

所以你想要存檔的東西是不可能的,因為它需要 C 語言結構來記住一些中間值。

我的建議是:盡可能少使用宏。 請記住 - 宏不是 C 語言,而是在實際編譯之前擴展。

暫無
暫無

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

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