有沒有辦法運行GCC預處理器,但只能用於用戶定義的宏?爲GCC運行「輕」預處理器
我有幾個單行程序和一些#ifdef
等條件,我想看看我的代碼在擴展時看起來像什麼。
正因爲如此,在包括得到擴展,輪到我fprintf(stderr)
s轉換fprintf(((__getreeent())->_stderr)
等直接
有沒有辦法運行GCC預處理器,但只能用於用戶定義的宏?爲GCC運行「輕」預處理器
我有幾個單行程序和一些#ifdef
等條件,我想看看我的代碼在擴展時看起來像什麼。
正因爲如此,在包括得到擴展,輪到我fprintf(stderr)
s轉換fprintf(((__getreeent())->_stderr)
等直接
呼叫cpp
,例如
$ cat >foo.c <<EOF
#define FOO
#ifdef FOO
foo is defined
#else
foo is not defined
#endif
EOF
$ cpp foo.c
# 1 "foo.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "foo.c"
foo is defined
當然,如果您包含任何標題,那麼這些標題將包含在輸出中。避免這種情況的一種方法可能是將grep -v
與#include
s(或者可能只是#include <
和允許#include "
)一致。或者,您可以指定-nostdinc
選項來刪除標準包含(但可能會保留在本地庫中,除非您指定include路徑以便它們不會被找到),但這會警告丟失標頭。
編輯:或者使用預處理器本身來包含有條件的頭文件,將它們包裝在類似#ifndef TESTING_PREPROCESSOR
之類的文件中並使用-DTESTING_PREPROCESSOR
。
cpp -nostdinc program.c
gcc -E inputfile.c > outputfile.c
outputfile.c將有你的預處理代碼,但所有宏將擴大。
我發現這個技巧在調試編譯包含大量include,編譯器標誌和makefile變量的大型系統時非常有用。它會暴露包含沒有標頭警衛的文件,以及其他一些問題。
這不就是運行預處理器的標準方式嗎?這是如何回答這個問題的?據推測,OP想要一個非標準的行爲(?)。 – 2014-10-13 16:55:24
這是標準的方式。如果您的程序在用戶定義的宏上非常繁重,並且在非用戶定義的宏上點亮,那麼用戶定義的宏將很容易被識別出來。通過運行inputfile.c和outputfile.c的diff。在許多情況下,gcc -E已經足夠好了,儘管在檢測「唯一」用戶定義的宏時非常完美。而且比使用其他答案中描述的完美方法要快得多。 – 2016-07-07 02:51:05
一個可使用工具,如unifdef,unifdefall - 刪除從代碼
預處理條件
1 - 尖端用於使'#include'線在'#if'部分是那些簡單而有效的事情之一可能不會出現某人,直到其他一些努力浪費在嘗試其他更復雜的事情上。 – 2010-04-11 04:56:40