SORU
29 EYLÜL 2008, PAZARTESİ


Numaralama türleri değişkenler C olarak dize kullanmak için kolay bir yolu?

Yapmaya çalıştığım şey şu:

typedef enum { ONE, TWO, THREE } Numbers;

Anahtarı bir durumda aşağıdakine benzer yapacak bir fonksiyon yazmaya çalışıyorum:

char num_str[10];
int process_numbers_str(Numbers num) {
  switch(num) {
    case ONE:
    case TWO:
    case THREE:
    {
      strcpy(num_str, num); //some way to get the symbolic constant name in here?
    } break;
    default:
      return 0; //no match
  return 1;
}

Her durumda tanımlama yerine, bir şekilde ayarlamak için yukarıda yapmaya çalıştığım gibi numaralandırma değişkeni kullanan var mı?

CEVAP
29 EYLÜL 2008, PAZARTESİ


// Define your enumeration like this (in say numbers.h);
ENUM_BEGIN( Numbers )
    ENUM(ONE),
    ENUM(TWO),
    ENUM(FOUR)
ENUM_END( Numbers )

// The macros are defined in a more fundamental .h file (say defs.h);
#define ENUM_BEGIN(typ) enum typ {
#define ENUM(nam) nam
#define ENUM_END(typ) };

// Now in one and only one .c file, redefine the ENUM macros and reinclude
//  the numbers.h file to build a string table
#undef ENUM_BEGIN
#undef ENUM
#undef ENUM_END
#define ENUM_BEGIN(typ) const char * typ ## _name_table [] = {
#define ENUM(nam) #nam
#define ENUM_END(typ) };
#undef NUMBERS_H_INCLUDED   // whatever you need to do to enable reinclusion
#include "numbers.h"

// Now you can do exactly what you want to do, with no retyping, and for any
//  number of enumerated types defined with the ENUM macro family
//  Your code follows;
char num_str[10];
int process_numbers_str(Numbers num) {
  switch(num) {
    case ONE:
    case TWO:
    case THREE:
    {
      strcpy(num_str, Numbers_name_table[num]); // eg TWO -> "TWO"
    } break;
    default:
      return 0; //no match
  return 1;
}

// Sweet no ? After being frustrated by this for years, I finally came up
//  with this solution for my most recent project and plan to reuse the idea
//  forever

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • rekjavicxxx

    rekjavicxxx

    28 EKİM 2007
  • spederson7

    spederson7

    17 Temmuz 2006
  • Visual Life

    Visual Life

    3 Temmuz 2006