![](/img/trans.png)
[英]is it considered good practice to have conditionals in public header files?
[英]Is it good practice to have the same function names in multiple header files?
我正在用C語言編寫一個用戶域(目前為止很少),就像BusyBox一樣,您可以在其中通過調用帶有其名稱的符號鏈接來運行命令。 我有一個“主” C文件,其中包含其中的所有其他文件(其他文件是頭文件),然后在符號鏈接名稱匹配時運行其代碼。 我想知道在不同的頭文件中具有相同名稱的函數是否正常?
例如,如果我有thing1.h
:
void help(void)
{
// Print help text for thing1
}
int thing1(int argc, char *argv[])
{
if (something)
help();
}
還有thing2.h
:
void help(void)
{
// Print help text for thing2
}
int thing2(int argc, char *argv[])
{
if (something)
help();
}
和everything.c
:
#include "thing1.h"
#include "thing2.h"
int main(int argc, char *argv[])
{
if (something)
thing1(argc, argv);
else
thing2(argc, argv);
}
將這些幫助函數分別重命名為thing1_help
和thing2_help
還是thing2_help
,還是可以將它們保留為原樣?
首先,請進一步了解C預處理程序的工作原理,並閱讀cpp
文檔 。
請注意,預處理是純文本操作。 因此,您可以避免使用任何頭文件和#include
指令,例如通過復制粘貼內容。 那將是一個壞主意。
因此,頭文件通常是常規的東西(但是, C99標准確實要求一些標准頭,例如<stdlib.h>
或<stdio.h>
; POSIX規范也要求一些頭)。 常見的做法包括:
static inline
函數的定義放在頭文件中。 實際上,原則上甚至可以在沒有任何stdlib.h
文本文件的情況下實現標准頭包含(例如#include <stdlib.h>
):編譯器實現例如可以查詢數據庫以處理#include <stdlib.h>
指令,但是我知道沒有編譯器這樣做。
有些人(包括我在內)正在將#include
指令(特別是對於標准C99或Posix頭文件)放入其頭文件中。 其他人則在自己的頭文件之前記錄要包含的頭列表。
查看代碼的預處理形式(這是大多數編譯器關心的,因為預處理器是編譯器的第一階段)。 您可以使用GCC使用以下方法獲取everything.c
的預處理形式:
gcc -C -E everything.c > everything.i
然后用編輯器或尋呼機查看everything.i
。
在實踐中,我會建議做-如果它真的是你的短thing2
一個static inline
函數,然后有一個單一 (沒有幾個)標題:
// file thing.h
#ifndef THING_INCLUDED_
// declarations
void help(void);
int thing1(int argc, char *argv[]);
// definition:
static inline void thing2(int argc, char**argv) {
if (something_with(argc, argv))
help();
}
#endif /*THING_INCLUDED_*/
然后將help
和thing1
的定義放在例如您的everything.c
並在其他#include
指令之后添加一個#include "thing.h"
。
這兩個幫助函數都應該是各自的c文件,因此名稱沖突並不重要,因為它們是該編譯單元范圍的私有文件。
通常,將代碼保存在c文件中,僅將聲明保存在h文件中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.