Есть ли простой способ сделать макрос для строки карты? - PullRequest
0 голосов
/ 12 ноября 2009

Например, в Windows, если я хочу сделать сообщение об ошибке gethostbyname значимым, мне нужно вручную сопоставить код ошибки с сообщением следующим образом:

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

int
main(void)
{
 struct hostent *host;
 WSAData wsaData;
 int errcode;

 if (WSAStartup(MAKEWORD(2, 2), &wsaData)) {
  perror("WSAStartup failed");
  exit(-1);
 }

 host = gethostbyname("www.google.com");

 if (host != NULL) {
  printf("the offical name of the host is: %s\n", host->h_name);
 } else {
  errcode = WSAGetLastError();
  printf("the error code is %d\n", errcode);
  if (errcode == WSAENETDOWN) 
   perror("network down");
  else if (errcode == WSANOTINITIALISED)
   perror("call WSAStartup before");
  else if ...
  perror("gethostbyname failed");
  return -1;
 }

 return 0;
}

Есть ли простой способ сделать это?

спасибо.

1 Ответ

0 голосов
/ 12 ноября 2009

Я думаю, что ваши коды уже легки, проверьте код ошибки и верните сообщение об ошибке. Если вы просто хотите сделать свои коды более элегантными, вы можете использовать массив пользовательских структур, как показано ниже.

struct ErrorInfo
{
  int Code;
  const char* Message;
};

ErrorInfo* errorMap = 
{
  { WSAENETDOWN,       "network down" },
  { WSANOTINITIALISED, "call WSAStartup before" },
};

const char* GetErrorMessage(int errorCode)
{
  for(int i=0; i<sizeof(errorMap)/sizeof(ErrorInfo)); i++)
  {
    if(errorMap[i].Code == errorCode)
      return errorMap[i].Message;
  }
  return "";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...