【问题标题】:Is it a good practice to use printf and fprintf in the same codeblock? [closed]在同一个代码块中使用 printf 和 fprintf 是一个好习惯吗? [关闭]
【发布时间】:2021-09-21 16:43:04
【问题描述】:

我记得听说在同一代码块中使用 printf()fprintf() 函数是一种不好的做法。

fprintf(stdout, "The first line,\n");  
printf("The second line,\n");

或者简单地说,

fprintf(somefile, "Its a file");
printf("Some text");

因此,我始终使用fprintf()fgets() 进行输入和输出。是不是我的错觉?

【问题讨论】:

  • 对与错取决于更大的代码上下文。这可能是一种薄弱的做法,但也存在例外情况。
  • 我想最好不要将fprintfprintf 混合用于标准输出,因为它会妨碍可读性,请选择其中一个。您还可以通过安全检查和“更好”的 unicode 支持检查新的 C11 printf_sfprintf_s
  • 这是我在 39 年的 C 编程生涯中第一次听到有人认为这是不好的做法。我并不是说没有人认为这是不好的做法,但他们必须提供一个很好的理由。
  • 第一个和第二个代码sn-ps完全不同。第一个有点毫无意义,只需使用printf(x) 而不是fprintf(stdout, x);,两者都做同样的事情。在第二个代码 sn-p 中,您将"Its a file" 打印到文件中,然后将"Some text" 打印到标准输出,这没有任何问题。
  • @Zilog80:注意printf_s 和朋友是 C11 的可选部分,AFAIK 选择采用它们的唯一主要实现是 MSVC。因此,使用这些“标准”功能将严重限制可移植性。

标签: c file conventions


【解决方案1】:

它对程序语义没有影响(因为 printf 被定义为与 fprintf 执行相同的操作,并插入了 stdout),并且编译器应该同等对待 printf(…)fprintf(stdout, …) 1

如果编译器在使用fprintf(somefile, "Its a file"); 时看不到somefilestdout,可能会产生一些影响。例如,在优化期间,如果编译器知道somefilestdout,它可能会将fprintf(somefile, "Its a file"); printf("Some text"); 优化为fputs("Its a fileSome text", stdout);。显然,如果它不知道somefilestdout,它就无法进行这种优化。

除了这些问题之外,问题只是人类行为之一——一个问题会更容易让人类读者感到困惑,还是更容易出现编辑错误或其他错误?我的评估是这些影响在这种情况下基本上是轻微的,但是采用统一的样式会很好,例如如果有某些理由强调 stdout 或使代码灵活编辑将其更改为另一个流。

脚注

1 从技术上讲,C 标准允许编译器使用 printf(…)fprintf(stdout, …) 做不同的事情,只要可观察的行为满足规则,但它也允许编译器根据具体情况做不同的事情关于当前行号是偶数还是奇数,好的编译器不会。

【讨论】:

    【解决方案2】:

    像这样的风格问题往往是主观的,是徒劳的辩论的素材。

    我会这么说

    fprintf(stdout, "The first line,\n");  
    printf("The second line,\n");
    

    风格很差。这会分散注意力并可能令人困惑。它会起作用,但它可能会给后来的读者留下错误的印象,可能暗示一个错误。这有点像在单词中随机大写单词和字母。

    如果你同时写入标准输出和文件,那么代码就像

    fprintf(somefile, "Its a file");
    printf("Some text");
    

    完全没问题。我无法想象为什么有人会反对。

    在我的 C 编程生涯早期,我认为将 printf 与其他输出函数混合使用是一种糟糕的风格。所以我会气馁

    printf("Part of the first line");  
    if(condition) printf(", and the rest");
    putchar('\n');
    

    我会更喜欢

    printf("Part of the first line");  
    if(condition) printf(", and the rest");
    printf("\n");
    

    我有这个偏好的一个非常具体的原因,但这不是一个很好的理由,我已经放弃了它。 (无论如何,混合printfputchar 并不是你要问的。)

    【讨论】:

      猜你喜欢
      • 2020-08-25
      • 1970-01-01
      • 2023-01-06
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多