English 中文(简体)
• 根据其价值印制标准名称?
原标题:Printing name of #define by its value?

我有一个C方案,对错误代码有某些定义。 与此类似:

#define FILE_NOT_FOUND -2
#define FILE_INVALID -3 
#define INTERNAL_ERROR -4
#define ... 
#define ... 

是否有可能按其价值打印定义的名称? 与此类似:

PRINT_NAME(-2);

// output
FILE_NOT_FOUND
问题回答

页: 1 这样做最容易的方式就是这样(PLEASE NOTE:这假设你永远不会有被分配为零/null的错误):

 //Should really be wrapping numerical definitions in parentheses. 
#define FILE_NOT_FOUND  (-2)
#define FILE_INVALID    (-3) 
#define INTERNAL_ERROR  (-4)

typdef struct {
  int errorCode;
  const char* errorString;
} errorType;

const errorType[] = {
  {FILE_NOT_FOUND, "FILE_NOT_FOUND" },
  {FILE_INVALID,   "FILE_INVALID"   },
  {INTERNAL_ERROR, "INTERNAL_ERROR" },
  {NULL,           "NULL"           },
};

// Now we just need a function to perform a simple search
int errorIndex(int errorValue) {
  int i;
  bool found = false;
  for(i=0; errorType[i] != NULL; i++) {
    if(errorType[i].errorCode == errorValue) {
      //Found the correct error index value
      found = true;
      break;
    }
  }
  if(found) {
    printf("Error number: %d (%s) found at index %d",errorType[i].errorCode, errorType[i].errorString, i);
  } else {
    printf("Invalid error code provided!");
  }
  if(found) {
    return i;
  } else {
    return -1;
  }
}

欢乐!

此外,如果你想在打字时节省更多费用,你可以采用先处理器的宏观方法,使之更糟:

#define NEW_ERROR_TYPE(ERR) {ERR, #ERR}
 const errorType[] = {
      NEW_ERROR_TYPE(FILE_NOT_FOUND),
      NEW_ERROR_TYPE(FILE_INVALID),
      NEW_ERROR_TYPE(INTERNAL_ERROR),
      NEW_ERROR_TYPE(NULL)
    };

现在,你只需要一度的宏观名称,减少打字机。

你可以这样做。

#include <stdio.h>

#define FILE_NOT_FOUND -2
#define FILE_INVALID -3 
#define INTERNAL_ERROR -4

const char* name(int value) {
#define NAME(ERR) case ERR: return #ERR;
    switch (value) {
        NAME(FILE_NOT_FOUND)
        NAME(FILE_INVALID)
        NAME(INTERNAL_ERROR)
    }
    return "unknown";
#undef NAME
}

int main() {
    printf("==== %d %s %s
", FILE_NOT_FOUND, name(FILE_NOT_FOUND), name(-2));
}

无,是不可能的。 这种印刷方式是什么?

#define FILE_NOT_FOUND   1
#define UNIT_COST        1
#define EGGS_PER_RATCHET 1

PRINT_NAME(1);

幼儿园

#define ERROR_CODE_1 "FILE_NOT_FOUND"
#define ERROR_CODE_2 "FILE_FOUND"

#define PRINT_NAME(N) ERROR_CODE_ ## N

static char* error_codes(int err) {
   static char name[256][256] = {

   };
   int base = .... lowest error code;
   return name[err - base];
}

#define PRINT_NAME(N) error_code(N)

为什么不选择使用一个清单?

enum errors {FILE_NOT_FOUND = -2, FILE_INVALID = -3, INTERNAL_ERROR = -4};

FILE *fp = fopen("file.txt", "r");


if(fp == NULL) {
    printf("Error
");
    exit(FILE_NOT_FOUND);
}

并非自动。 在汇编过程中,该名称正在丢失,在法典中只剩下不变的数字。

但是,你们可以建设这样的东西:

const char * a[] = {"","","FILE_NOT_FOUND","FILE_INVALID"};

将绝对值定义为指数,并以此加以利用。

为此使用C99的指定初步设计器,但如果你的错误编码是负面的,则需要一定程度的护理。

第一版正面价值:

#define CODE(C) [C] = #C

static
char const*const codeArray[] = {
CODE(EONE),
CODE(ETWO),
CODE(ETHREE),
};

enum { maxCode = (sizeof codeArray/ sizeof codeArray[0]) };

这分配了一个阵列,其长度与你需要的时间长度相距甚远,并配以适当的位置。 请注意,标准允许重复值,最后一种是实际储存在阵列中。

如果指数小于<代码>maxCode/code>,则需加以核对。

如果你的代码错误总是负面的,那么你就不得不在印刷前否定该代码。 但是,以其他方式开展这项工作可能是一个好主意:守则是正面的,并核对其签署价值。 如果是负面的,错误代码就是否定价值。

这就是我如何在C中这样做:

< MyDefines.h >

#pragma once 

#ifdef DECLARE_DEFINE_NAMES
// Switch-case macro for getting defines names
#define BEGIN_DEFINE_LIST  const char* GetDefineName (int key) { switch (key) {
#define MY_DEFINE(name, value)  case value: return #name;
#define END_DEFINE_LIST } return "Unknown"; }

#else

// Macros for declaring defines
#define BEGIN_COMMAND_LIST /* nothing */
#define MY_DEFINE(name, value)  static const int name = value;
#define END_COMMAND_LIST /* nothing */

#endif

// Declare your defines
BEGIN_DEFINE_LIST

MY_DEFINE(SUCCEEDED,       0)
MY_DEFINE(FAILED,         -1)
MY_DEFINE(FILE_NOT_FOUND, -2)
MY_DEFINE(INVALID_FILE,   -3)
MY_DEFINE(INTERNAL_ERROR  -4)
etc...

END_DEFINE_LIST

< MyDefineInfo.h >

#pragma once
const char* GetDefineName(int key);

< MyDefineInfo.c >

#define DECLARE_DEFINE_NAMES
#include "MyDefines.h"

现在,你可以像现在这样使用已宣布的开关单宏观:

< WhereEver.c >

#include "MyDefines.h"
#include "MyDefineInfo.h"

void PrintThings()
{
    Print(GetDefineName(SUCCEEDED));
    Print(GetDefineName(INTERNAL_ERROR));
    Print(GetDefineName(-1);
    // etc.
}




相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签