2017-06-14 67 views
0

上下文:長時間的程序員,回到C作爲一個孩子。對於您可能會遇到的問題表示歉意。C:應用宏,不編譯

我可以將宏應用於C程序而無需編譯它嗎?

我瞭解C宏的:他們前處理您的源文件交給受編譯

:這是我的文件
編譯:OK,讓我申請的宏得到我可以編譯的東西
編譯器:好的,應用宏,讓我們編譯這個

有沒有辦法查看真正爲編譯而傳遞的程序文件?即一種應用宏的方式,但是而不是編譯該程序。

例如,我有一個使用宏的PRIxPTR的小程序。

#include <stdio.h> 
#include <stdint.h> 

//needed for the PRI*PTR Macros 
#include <inttypes.h> 

int main() 
{ 
    int i = 42; 
    int* pI = &i; 

    printf("iP points to address (base 16): %" PRIxPTR "\n", (uintptr_t) pI);   
    printf("iP points to address (base 10): %" PRIdPTR "\n", (uintptr_t) pI);     
} 

編譯和運行程序

$ cc main.c; ./a.out 

產生以下輸出

iP points to address (base 16): 7fff545f587c 
iP points to address (base 10): 140734608922748  

我想看到C源,其PRIxPTR宏實際上產生。

這似乎是可能的 - 是嗎?如果不是,我對宏的理解是不正確的?或者有什麼可以防止這種情況發生?

+1

的https://stackoverflow.com/questions/985403/seeing-expanded-c-macros – Zakir

+1

至少有些IDE可以擴大個人宏調用Dup的對你也是。我知道Eclipse/CDT將指針懸停在一個上時會執行此操作。請注意,如果IDE環境和選項與編譯器的環境和選項不同,則擴展可能會有所不同。 –

+1

「我可以在不編譯它的情況下將宏應用於C程序嗎?」 - 當然。 C ** pre **處理器可以在編譯器之前運行。 – Olaf

回答

3

如果您使用的是gcc,請使用-E選項。這將生成stdout的預處理器輸出。

gcc -E -o src_pp.c src.c 

src_pp.c的內容:

# 1 "src.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "/usr/include/stdc-predef.h" 1 3 4 
# 1 "<command-line>" 2 
# 1 "src.c" 
# 1 "/usr/include/stdio.h" 1 3 4 

... 

# 6 "src.c" 2 

int main() 
{ 
    int i = 42; 
    int* pI = &i; 

    printf("iP points to address (base 16): %" "l" "x" "\n", (uintptr_t) pI); 
    printf("iP points to address (base 10): %" "l" "d" "\n", (uintptr_t) pI); 
} 
+1

如果您的編譯器不提供此功能,您可以嘗試查找宏定義,然後手動進行文本替換。這在一些情況下很容易。 –

+0

謝謝@dbush!我會把這個標記爲最好的,但這個問題已經被封閉了。 –

+0

@AlanStorm我認爲你仍然可以接受15分鐘過去了。 – dbush