-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()

附带说明一下,避免使用,"*"而不是'*'因为,"*"在内存中创建一个带有两个字节的空间,一个用于*,另一个用于\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

测试.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 回答