2016-02-18 15 views
0

我有一個C頭文件作爲我正在開發的API的一部分,它公開了許多函數。例如:如何使用宏或其他機制強制執行A​​PI定義?

api.h

void foo(); 
int bar(char * foobar); 

現在,我最暴露的功能API中被實際的定義,但是,也有一些是我離開的使用,開發人員來實現自己。爲了使它更容易爲開發商和執行符合我的API添加以下宏:

api.h(修改)中使用

#define DEFINE_FOO() \ 
     void foo() 
void foo(); 
#define DEFINE_BAR() \ 
     int bar(char * foobar) 
int bar(char * foobar); 

如下:

實施.C

#include "api.h" 
DEFINE_FOO() { 
    // Codez 
} 

DEFINE_BAR() { 
    // More codez 
} 

一個困擾我關於這個程序的事roach是開發人員將使用DEFINE_ *宏,但不一定直觀,一個函數,即「酒吧」需要參數。有沒有一種方法可以改進這種方法,或者有更好的方法來在C中實施自定義API定義嗎?謝謝!

+1

使用正確的原型。舊式宣言已棄用。堆棧溢出不是討論的地方。 (但我認爲你的方法使得調試更加困難並且不會增加任何好處)。 – Olaf

+1

它現在不使用IDE,但我的經驗是使用宏來實現代碼使得很難跟蹤源代碼,例如行號不起作用。我建議使用一個代碼宏,顯然不會讓生活變得簡單,但是當沒有其他方法可以做到時。對於'qsort',用戶提供的函數'cmp'沒有任何問題。 –

+1

我建議不要這樣做。如果用戶應該提供某些功能,請在文檔中解釋它,並在那裏顯示所需的簽名。這些宏根本不能幫助他,只是讓代碼看起來很不尋常。 – Barmar

回答

2

有:

#define DEFINE_BAR(arg) \ 
     int bar(char* arg) 

現在,程序員可以調用

DEFINE_BAR(arg_name) { 
    return strlen(arg_name); 
} 

這將變成由CPP以下真的不需要使用宏,我建議反對它(我已經完成大量在[最近35年]以上的宏「瘋狂」的事情)。

如果您正在定義API,這意味着您將[ANSI]原型放入api.h,對於全部爲您的功能。這並不意味着將實現它們 - 它只意味着你定義了架構/ API。在api.h中沒有原型的任何函數都不是API的一部分[顯然]。

如果你這樣做,編譯器將標記任何不匹配。只需要開發人員在頂部包含api.h即可。

下面是一個api.h

void foo(void); 
int bar(char *foobar); 

良好符合.c將順利地編譯:

#include "api.h" 
#include <stdio.h> 

void 
foo(void) 
{ 
} 

int 
bar(char *str) 
{ 
    return 0; 
} 

不符合標準的.c正確編譯:

#include "api.h" 
#include <stdio.h> 

void 
foo(int x) 
{ 
    printf("foo: %d\n",x); 
} 

int 
bar(char *str) 
{ 
    return 0; 
} 

你會得到編譯錯誤:

bad.c:5:1: error: conflicting types for ‘foo’ 
foo(int x) 
^ 
In file included from bad.c:1:0: 
api.h:2:6: note: previous declaration of ‘foo’ was here 
void foo(void); 
    ^

所以,如果開發人員犯了一個錯誤,普通的代碼定義將處理它。

2

我不會真的推薦你的方法,但你可以在技術上使其工作。

你可以傳遞參數到宏這樣:

int bar(char* arg_name) { 
    return strlen(arg_name); 
} 
+0

你會推薦一個更好的方法或描述它的鏈接嗎?謝謝 – penguin4hire

+3

@ pragmatic-penguin更好的方法是記錄用戶必須實現的內容。定義第一行的宏並不能幫助他。 – Barmar

+1

我想回應巴馬爾所說的話。在這裏使用宏不僅增加了調試宏的困惑,而且文檔也是必需的。用戶可能會想要閱讀文檔,而不是從函數原型推斷出必要的信息。 但是,根據你實際要做的事情,傳遞函數指針可能是一個更好的選擇。例如,支持排序的數據結構的比較器或排序函數。而不是強迫用戶實現你的功能,給他們一個規範,讓他們做他們想做的事。 – user2525056