簡體   English   中英

在公共頭文件中使用條件是一種良好的做法嗎?

[英]is it considered good practice to have conditionals in public header files?

我的C庫有一些可選功能,使用automake,用戶可以通過提供配置標志來打開和關閉它們。

如果關閉某個功能,則不會編譯該功能。

但是,我的問題是,在這種情況下,我是否應該從公共頭文件中刪除函數原型?

這似乎不是一個好主意,有未編譯函數的函數原型,但它似乎我不是一個好主意,有不同的公共報頭裝取決於庫配置。 (類似於在公共頭文件目錄中安裝config.h的不良做法。)

對於可選功能,公共標題的最佳方法是什么? 如果用戶嘗試使用禁用的功能,錯誤應該在編譯時還是鏈接時? 這種情況必須有標准做法。 (如果有多個想法,我更願意遵守GNU編碼標准,但我不知道關於這個問題的GNU標准。)

Definetely不僅要從編譯中排除實現,還要排除整個函數。

//feature.h
#ifndef EXCLUDE_FEATURE
   void foo();
#endif

//feature.c
#include "feature.h"
#ifndef EXCLUDE_FEATURE
void foo()
{
}
#endif

這樣,如果您嘗試在排除功能的情況下使用foo ,您將獲得編譯器,而不是鏈接器錯誤。 您希望盡快發出錯誤信號,鏈接器錯誤通常會減少開發人員的意圖。

Microsoft為MFC做了這個(頭文件中的條件)並且它工作得非常好。 (當然那是C ++,但原則就是這樣。

我認為這個問題有兩種有效的方法

  • 有一個頭文件,使用#ifdef刪除某些配置不支持的功能
  • 有多個沒有#ifdef頭文件,每個頭文件都是特定於配置的

在給定配置的頭文件中保留lib中不存在的函數似乎是一種非常糟糕的做法。 它將需要編譯時錯誤並將其移動到鏈接器1。

我在一些項目中觀察到以下方法:從模板中生成頭文件。

文件生成基於配置標志。

這種方法在我看來比在標題中使用永不停止的條件定義更清晰...對我來說它看起來更干凈。

缺點:它可能是一個支持負擔(對於腳本)。

暫無
暫無

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

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