-1

Cプログラムでは、次の行を使用します。printf("%c", WORD_SEP);これは自明だと思います。

私が理解している限り、printfはFormat-String "%c"を解析し、実行時に文字WORD_SEPに置き換えます。もちろん、WORD_SEPはコンパイラ#defineであり、変更されることはないため、これは完全に回避できます。

より高速なハードコーディングprintf("*");を行うこともできますが、もちろん、保守性のために#defineを保持したいと思います。また、printfは文字列を解析する必要があるため、最適ではありません。

もっと良い方法はありますか?

4

3 に答える 3

1

書式なし単一文字印刷:

putc()putchar()およびfputc()

書式なし文字列印刷:

fputs()、そして私の(それほどではない)お気に入りputs()

"*"ちなみに、の代わりにを使用する'*'ことは避けてください。"*"メモリ内に2バイトのスペースが作成されます。1つは用*、もう1つは用\0です。1つの文字が必要な場合は、'*'代わりにを使用してください"*"

于 2013-02-17T06:28:54.577 に答える
0

うまくいけば、私は質問を誤解していませんが、最終的に次のようなことをしたい場合は

printf("abc %c xyz", WORD_SEP);

実行時にこの定数の単語区切り記号を実際に挿入しなくても、最初に行うことができます

#define WORD_SEP "*"

そして、する

printf("abc " WORD_SEP " xyz");

これにより、コンパイル時にフォーマット文字列が作成されます。以下のコメントで述べたように、この場合、文字がフォーマット文字列の一部になっているため、%文字を含めることに注意する必要があります。WORD_SEP

于 2013-02-17T06:36:58.380 に答える
0

私の知る限り、printf は Format-String "%c" を解析し、実行時に文字 WORD_SEP に置き換えます。WORD_SEP はコンパイラ #define であり、変更されることはないため、これはもちろん完全に回避できます。

そして、gcc はprintf("%c", WORD_SEP);への呼び出しに最適化しますputchar('*'):

#include <cstdio>

#define WORD_SEP '*'

int main() {
    printf("%c", WORD_SEP);
}

出力形式:

g++ -S --verbose-asm -o - -DNDEBUG -g -Wall -Wextra -march=native -O3 test.cc | c++filt > test.s

test.s:

main:
    subq    $8, %rsp    
    movl    $42, %edi   
    call    putchar 
    xorl    %eax, %eax  
    addq    $8, %rsp
    ret

また、gccは、フォーマット指定子のないフォーマット文字列の解析を避けるために最適printf("..." /* no arguments */)化します。puts()

于 2013-02-17T13:21:59.233 に答える