簡體   English   中英

在多個頭文件中使用相同的函數名稱是否是一種好習慣?

[英]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_helpthing2_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_*/

然后將helpthing1定義放在例如您的everything.c並在其他#include指令之后添加一個#include "thing.h"

這兩個幫助函數都應該是各自的c文件,因此名稱沖突並不重要,因為它們是該編譯單元范圍的私有文件。

通常,將代碼保存在c文件中,僅將聲明保存在h文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM