2012-01-05 43 views
1

我有一些C源代碼需要擴展#define宏(和#ifdefs等等),但不是#includes#includes應該保持不變。避免預處理#includes

可以通過使用cpp(C預處理器)嗎?

+1

包含的文件是否確定了定義參數的值? – thiton 2012-01-05 12:24:40

+0

不,只是stdio.h – 2012-01-05 12:30:08

回答

0

有了GCC,這是不可能的。

2

不,它不是,因爲#include是一個預處理指令。

您擁有的唯一可能性是在刪除#include指令後啓動cpp文件。

如果你有一個Unix外殼採用GNU的grep,這是可以做到,比如,與:

grep -Pv '^\s*#\s*include\b' thefile.c|cpp 
1

如果這些包含文件的樣子:

inc_file1.h 

#if !defined(INC_FILE1_H) 
#define INC_FILE1_H 

/// some code 

#endif 

,那麼你可以定義INC_FILE1_H你自己造成inc_file1.h裏面的聲明不被處理

2

有沒有直接的方法..所以我已經嘗試了下面的程序,它適用於大多數.c文件臨我有。我已採取@fge grep並添加了一些更多的代碼以及gcc -E ..希望這可以幫助!

#!/bin/bash 

if [[ $# -ne 1 || ! -f $1 ]] ; then 
    echo "Invalid args/Check file " 
    exit 
fi 

file_name=$1 

grep '^\s*#\s*include' $file_name > /tmp/include.c 
grep -Pv '^\s*#\s*include\b' $file_name > /tmp/code.c 
gcc -E /tmp/code.c | grep -v ^# > /tmp/preprocessed.c 
cat /tmp/include.c > $file_name.done 
cat /tmp/preprocessed.c >> $file_name.done 
+0

謝謝,我會試一試! – 2012-01-05 13:11:25

+0

這會將所有包含移動到文件的開始位置,但如果您的代碼包含類似'#ifdef __GNUC__ \ n #include \ n #else \ n #include \ n #endif '。我寧願用'FOOBARinclude'替換'#include',預處理,然後用##替換FOOBAR。爲了安全起見,FOOBAR可能是一個很長的隨機字符串/ GUID /不管。 – 2012-01-05 15:11:21

+0

是的,這是一個非常原始的腳本。但可以更新以適應所有不同的'c'文件。你的替換想法看起來不錯!讓我知道事情的後續。 – 2012-01-05 15:26:38

1

如果你有一個源文件(或只有幾個),你所能做的就是評論的#include指令,例如:

#if 0 
#include "include1.h" 
#include "include2.h" 
#endif 

,然後運行在源文件中的預處理。

+0

更好的是,用'/ * ... * /'註釋掉它們並使用選項'-C',那麼它們將不會從預處理器輸出中刪除。 – ams 2012-01-05 16:12:27

1

如果你有Emacs方便的話:c-macro-expand綁定到C-C C-e只能擴展標出的區域。這也會考慮包含,但會將命令的輸出限制在標記的部分。如果你做宏編程,最好的命令之一。