回答
有了GCC,這是不可能的。
不,它不是,因爲#include
是一個預處理指令。
您擁有的唯一可能性是在刪除#include
指令後啓動cpp文件。
如果你有一個Unix外殼採用GNU的grep,這是可以做到,比如,與:
grep -Pv '^\s*#\s*include\b' thefile.c|cpp
如果這些包含文件的樣子:
inc_file1.h
#if !defined(INC_FILE1_H)
#define INC_FILE1_H
/// some code
#endif
,那麼你可以定義INC_FILE1_H你自己造成inc_file1.h裏面的聲明不被處理
有沒有直接的方法..所以我已經嘗試了下面的程序,它適用於大多數.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
謝謝,我會試一試! – 2012-01-05 13:11:25
這會將所有包含移動到文件的開始位置,但如果您的代碼包含類似'#ifdef __GNUC__ \ n #include
是的,這是一個非常原始的腳本。但可以更新以適應所有不同的'c'文件。你的替換想法看起來不錯!讓我知道事情的後續。 – 2012-01-05 15:26:38
如果你有一個源文件(或只有幾個),你所能做的就是評論的#include
指令,例如:
#if 0
#include "include1.h"
#include "include2.h"
#endif
,然後運行在源文件中的預處理。
更好的是,用'/ * ... * /'註釋掉它們並使用選項'-C',那麼它們將不會從預處理器輸出中刪除。 – ams 2012-01-05 16:12:27
如果你有Emacs方便的話:c-macro-expand
綁定到C-C C-e只能擴展標出的區域。這也會考慮包含,但會將命令的輸出限制在標記的部分。如果你做宏編程,最好的命令之一。
- 1. 避免處理底層流
- 2. 如何避免在此預處理器宏中需要括號?
- 3. 避免鏈接的模板而不是cpp預處理器?
- 4. 避免eclipse格式化預處理器指令
- 5. Android - 避免AlertDialog關閉(錯誤處理)
- 6. 避免路徑名稱與批處理
- 7. 如何處理或避免BlockedIndefinitelyOnSTM異常?
- 8. 如何避免重複異常處理?
- 9. 避免處理wheelEvent前景的項目
- 10. ios swift:@IBAction處理以避免segue
- 11. 避免重疊日誌處理
- 12. 用JavaScript處理表單提交事件,避免「表單處理」
- 13. 預處理語句和逃避
- 14. UIImagePickerController - 避免「預覽」屏幕
- 15. .htaccess·使用rewritecond來處理includes?
- 16. 告訴NVCC爲NOT預處理主機代碼,以避免重新定義BOOST_COMPILER
- 17. 處置父母時如何避免子表單處理?
- 18. 的OpenGL ES:避免紋理
- 19. Cassandra - 避免nodetool清理
- 20. Gulp:限制文件處理併發性;避免同時處理*所有文件*
- 21. 避免保證金預標籤
- 22. 如何避免「預檢請求」?
- 23. Mercurial避免擱置預掛鉤
- 24. 如何避免預編譯頭文件
- 25. 避免使用干預Fortrabbit中的ImageNotWritableException
- 26. 如何避免預防默認
- 27. 在預處理
- 28. GLSL預處理
- 29. 預處理
- 30. 預處理
包含的文件是否確定了定義參數的值? – thiton 2012-01-05 12:24:40
不,只是stdio.h – 2012-01-05 12:30:08