0

コマンドの出力 (フラグ付き) をマクロのプリプロセッサ (例: ) として使用できますuname --kernel-name

#include <stdio.h>

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

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

以下を使用してコンパイル:

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

出力:

Version: Linux

#ただし、マクロが(例uname --kernel-version: )で始まる場合、これは失敗します。

david@debian:~$ 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"

有効な入力を取得するには?

4

1 に答える 1

1

簡単。

交換

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

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

これは、-Dフラグが定義と同等であるため機能します。Soは、ソースに-Dvar=vala を持つことと同じです。#define var val

を実行する-Dkernel_name="\"$(uname --kernel-name)\""と、シェルは define オプションの値を等しい値に変換します"#1 SMP Debian 3.2.46-1+deb7u1"。1 組の引用符はシェル用で、もう 1 組は実際のプログラム用です。これにより、文字列化する必要もなくなります。

于 2013-10-22T10:58:08.850 に答える