2014-05-09 1 views
2

I/O 호출에서 많이 사용되는 초기 유형으로 시작하여 나중에 유형을 변경하고자 할 수 있습니다. 예를 들어, 우리가 말 : 우리가 나중에 board_idx의 종류를 변경하는 경우C stdlib 함수에서 형식 지정자 추상화 (예 : printf, scanf)

typedef unsigned short int board_idx; 
//... 
board_idx k_in; 
scanf("%10hu", &k_in); 

, 돌아가서 나중에이 일치하도록 이러한 모든 형식 지정을 변경하기 힘든 것입니다.

먼저 형식 지정자 (예 : board_idx의 형식 정의 옆에있는 것이 좋음)에 연결된 문자열 리터럴을 정의한 다음이를 형식 지정자의 모든 관련 위치에 삽입하는 것이 좋은 방법이라고 생각했습니다. 그러나 이것은 또한 다소 어려워 보입니다 (예 : strcat 사용). 그래서이 상황에서 다른 사람들이 무엇을 할 것인지 궁금합니다.

How to replace a piece of const char* with another string in C?에 대한 접근 방식을 구축하면 형식 바꾸기 코드를 해당 형식에 해당하는 고유 식별자가있는 형식 지정자에 적용 할 수있는 함수로 캡슐화하면 가능할 수 있음을 알 수 있습니다. 위의 scanf 예에서,이 수 :

"%10hu" // should be initially "%board_idx", which can then be replaced 

이 방법의 단점은 런타임 비용, 그래서 지금은 형식 지정이 알려진에 포함 된 모든 문자열로 한 프리 프로세서 솔루션은 가장 좋은 것 같아요

// Untested and probably won't work ... I'll call it pseudocode: 
#define STR(x) #x 
#define STRINGIFY(x) STR(x) 
// 
#define BOARD_IDX_FMT = %10hu 
// "my input is %10hu" becomes: 
#define FMTSPEC STRINGIFY(my input is) #BOARD_IDX_FMT 
printf(FMTSPEC); 

그러나이 또한 많은 형식 지정자가있는 문자열의 경우 매우 복잡 할 수 있습니다.

+1

그냥 매크로에 따옴표를 넣고 모든 문질러 뭉개진 것들을 피하십시오 ..'#define BOARD_IDX_FMT "% 10hu"' –

답변

4

그러나,이 또한 C에서

(예 : strcat와 사용) 다소 힘든 것 같다

"asd" "qwe" --> "asdqwe" 

때문에이 라인을 따라 뭔가 일을해야 인접한 문자열 리터럴이 자동으로 컴파일시에 연결됩니다

#define FMT "%d" 
printf("Hello " FMT "!\n", 17); 
1

어쩌면 당신은 단순히 캐스팅 할 수 있습니다.

printf("Hello %d \n", (int)k_in); 

인쇄 및

int n; 
scanf("%10u", &n); 
k_in = (board_idx) n; 

k_in을 읽을 수 : 값 대신에 감동 형식과 사용.