簡體   English   中英

確定C宏的擴展

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

這要求我仍然知道AAABBB是什么。

編譯:

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) ; 只是重新掃描宏擴展的結果,以便擴展更多的宏,此時AAABBB分別變為110

或許這是一個更清楚的例子

#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.

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