[英]Determine the expansion of a C macro
有沒有辦法通過檢查編譯對象或在.c或.h文件上運行某種形式的gcc -E來確定擴展C宏的“最終值”?
test.h
#define AAA 1
#define BBB 10
#define CCC (AAA+BBB)
test.c的
#include <stdio.h>
#include "test.h"
int main(){
printf("%d\n", CCC);
return 0;
}
因此,有一些方法可以獲得擴展值:
#define CCC 11
要么
#define CCC (1+10)
如果編譯
gcc -dM -E test.c | grep CCC
要么
gcc -dD -E test.c | grep CCC
輸出
#define CCC (AAA+BBB)
這要求我仍然知道AAA
和BBB
是什么。
編譯:
gcc -E test.c
給(跳過樣板):
# 4 "test.c"
int main(){
printf("%d\n", (1+10));
return 0;
}
雖然它的擴展CCC
我現在已經失去了映射回CCC
。
編輯:由於目前還不清楚,我想要的是確定CCC是什么(11或1 + 10(因為gcc -E示例顯示它只插入(1 + 10)而不是11),最好不要改變代碼本身.Printf在MRE中使用是一個壞主意,我實際想到的是代碼:
struct my_struct {
int my_array[CCC]
... other stuff ...
}
問題是my_array有多大,所以我可以用另一種語言(python通過ctypes)創建一個結構,並知道我需要多少空間。 我知道結構我可以使用pahole但是希望只使用gcc並且在更一般的情況下(比如不在結構中的全局數組)。
在任何時候,預處理器都不會創建
#define CCC (1+10)
CCC
的擴展總是(AAA+BBB)
; 只是重新掃描宏擴展的結果,以便擴展更多的宏,此時AAA
和BBB
分別變為1
和10
。
或許這是一個更清楚的例子
#define AAA 1
#define CCC AAA
#define AAA "hello"
size_t x = sizeof CCC;
此代碼將擴展為"hello"
,而不是1
。 CCC
始終具有AAA
值; 只是在時間size_t x = sizeof CCC;
處理完畢后, AAA
本身就會變成"hello"
。
此示例還演示了可以重新定義宏,因此甚至可能沒有一個單獨的答案“ CCC
的價值是什么?”。
這就是沒有簡單的編譯器調用或切換的原因; 你想要的東西根本不存在。
也就是說,如果你可以使用自定義代碼,你可以運行eg
#define AAA 1
#define BBB 10
#define CCC (AAA+BBB)
CCC
通過gcc -P -E
,結果將只是(1+10)
。
#include <stdio.h>
#define AAA 1
#define BBB 2
#define CCC (AAA+BBB)
#define STRINGIFY(x) #x
#define PASTE(x) STRINGIFY(x)
int main(void)
{
printf("CCC = '%s'\n", PASTE(CCC));
}
版畫
CCC = '(1+10)'
打印相同的替代版本:
#include <stdio.h>
#define AAA 1
#define BBB 2
#define CCC (AAA+BBB)
#define STRINGIFY(x) #x
#define INTERMEDIATE(x) #x " = '" STRINGIFY(x) "'"
int main(void)
{
printf("%s\n", INTERMEDIATE(CCC));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.