你確定你想在C而不是C++中實現嗎?以下全部假設你真的想要C。
首先,C不知道關鍵字operator
,而且你不能給一個函數命名帶兩個單詞。因此你需要給你的函數一個不同的名字,比如operator_new
。鑑於你的函數顯然只適用於整數(在你的接口中沒有辦法提供有關類型的信息,並且你的示例實現爲s
int
s分配空間),所以我建議使用new_ints
(因爲C沒有構造函數, new
和operator new
之間的區別是沒有意義的)。或者,您可能需要傳遞參數,告訴您要分配的類型的大小。你甚至可以傳遞一個指向你想作爲對象的「構造函數」的函數的指針(使用void*
接口)。
另外C也沒有例外。你可能會用setjmp
/longjmp
來模擬它們,但是因爲C不知道析構函數,它不會爲你做清理工作。但是,知道您的手工異常處理的代碼可能會通過一系列setjmp
緩衝區明確實施清理。然而,那些setjmp緩衝區需要傳遞給你的函數,或者使用額外的參數,或者使用全局變量。總而言之,C中更好的選擇是返回NULL
,如malloc
所做的那樣。但是,如果你堅持的例外部分,這是你會如何做(未經測試):如下
#include <setjmp.h>
#include <stdlib.h>
void* operator_new(size_t s, /* how many bytes to allocate */
jmp_buf env) /* the "exception" information */
{
void* block = malloc(s);
if (!block)
longjmp(env, 1); /* 1 is an "error code" */
return block;
}
的功能將被稱爲:
int main()
{
volatile jmp_buf env; /* I'm actually not sure if this has to be volatile,
but longjmp may mess up some non-volatile variables */
if (!setjmp(env)) /* try */
{
int* p = operator_new(10*sizeof int, env);
/* use p */
free(p)
}
else /* catch(...) */
{
/* handle the error */
}
}
C也沒有運營商定義/超載... – Mysticial
你似乎對**想說哪種語言感到困惑**。在開始編寫源代碼之前,這是一個重要的決定。 –
標題中的C,標記中的C++ - 出錯了。 –