2013-10-22 5 views
0

우리는 (예를 들어 uname --kernel-name.)견적 -D

#include <stdio.h> 

#define version(v) #v 
#define VERSION(v) version(v) 

int main(void) 
{ 
    printf("Version: %s\n", VERSION(kernel_name)); 
    return 0; 
} 

사용 컴파일 된 매크로 사전 procesor로 (플래그) 명령의 출력을 사용하여 매크로 전처리 :

gcc -Wall -pedantic -o demo demo.c -Dkernel_name=$(uname --kernel-name) 

출력 :

Version: Linux 

그러나 매크로로 시작 때 실패 # (예 :. 0) : 명령의 출력을 인용하는 방법은

[email protected]:~$ uname --kernel-version 
#1 SMP Debian 3.2.46-1+deb7u1 

당신이 전처리 #

#define SOMETHING #something /* error: stray ‘#’ in program */ 

시작으로 정의 할 수 없기 때문에이 있습니까?

"#1 SMP Debian 3.2.46-1+deb7u1" 

올바른 입력을 얻으려면?

답변

1

쉬운.

-D 플래그가 정의에 해당하기 때문에이 작동

-Dkernel_name="\"$(uname --kernel-name)\"" 

-Dkernel_name=$(uname --kernel-name) 

를 교체합니다. 따라서 -Dvar=val은 소스에 #define var val이있는 것과 같습니다.

-Dkernel_name="\"$(uname --kernel-name)\""을 실행하면 쉘이 정의 옵션 값을 "#1 SMP Debian 3.2.46-1+deb7u1" (사용자의 쉘에 대한 따옴표 집합과 실제 프로그램에 대한 따옴표 집합)으로 변환합니다. 이렇게하면 문자열 화하지 않아도됩니다.

+0

어리석은 me !!, 매력처럼 작동합니다. "$"(uname - kernel-name) ""' –

+0

예, 놓치지 않으 셨습니다. :) – tangrs

+0

:(예, 감사합니다 !! –