gcc 4.7.2
c89
こんにちは、
チャネルの現在の状態に基づいて文字列を返す関数があります。使用するより良いテクニックは何だろうと思っています。最初に、メモリが常に有効になるようにメモリ プールを使用します。2 つ目は、return ステートメントで文字列を返すだけです。3 つ目は、スタックに割り当てられたローカル ポインターを使用して、それを返します。
いずれの場合も、文字列を出力するだけで、それ以外には使用しません。
どちらをお勧めしますか?
ご提案いただきありがとうございます。
次のような関数を使用します。
MODULE_LOG(PRIO_DEBUG, "%s|%s",
g_channel_state_to_string(channel->previous_state, channel->mem_pool),
g_channel_state_to_string(channel->current_state, channel->mem_pool));
渡されたメモリ プールの使用
static char* g_channel_state_to_string(states_e state, apr_pool_t *mem_pool)
{
char *channel_state = NULL;
switch(state) {
case CHANNEL_IDLE:
channel_state = apr_pstrdup(mem_pool, "CHANNEL_IDLE");
break;
default:
channel_state = apr_pstrdup(mem_pool, "CHANNEL_UNKNOWN_CHANNEL_STATE");
break;
}
return channel_state;
}
return ステートメントで文字列を返す
static char* g_channel_state_to_string(states_e state)
{
switch(state) {
case CHANNEL_IDLE:
return "CHANNEL_IDLE";
break;
default:
return "CHANNEL_UNKNOWN_CHANNEL_STATE";
break;
}
}
文字列リテラルをローカル ポインターに割り当てると、メモリがスタックに割り当てられ、関数が戻るときに存在しない可能性があるため、スタック ダンプが発生する可能性があります。
static char* g_channel_state_to_string(states_e state)
{
char *channel_state = NULL;
switch(state) {
case CHANNEL_IDLE:
channel_state = "CHANNEL_IDLE";
break;
default:
channel_state = "CHANNEL_UNKNOWN_CHANNEL_STATE";
break;
}
return channel_state;
}