【问题标题】:C preprocessor: macro function to call printf()C 预处理器:调用 printf() 的宏函数
【发布时间】:2014-04-13 06:50:56
【问题描述】:

我想有条件地使用 printf() 或语句:

#define USE_PRINTF

#ifdef USE_PRINTF
#define macrofn(str) printf(str)
#else
#define macrofn(str) some_statement
#ifndef USE_PRINTF

但我收到以下错误:

incompatible implicit declaration of built-in function 'printf'

我做错了什么?谢谢

【问题讨论】:

  • 请贴出调用宏的代码。
  • 不添加#include <stdio.h>?
  • 这不正确...您应该使用#endif 而不是#ifndef USE_PRINTF,这意味着“如果未定义USE_PRINTF”,这已经是由#else 部分处理。对于每个 #if,您绝对需要一个 #endif
  • @ThoAppelsin:不错的收获!!但是编译器不会因为这个错误而抱怨没有匹配的endif
  • 只使用一个参数printf 的目的是什么? puts 在大多数情况下不应该更合适吗?另见stackoverflow.com/a/16813480/908515

标签: c macros c-preprocessor


【解决方案1】:

您不必在宏定义之前包含<stdio.h>。你真正需要的是#endif 用于你已经开始的#if。例如,以下程序可以正常工作:

#define USE

#ifdef USE
#define asd printf("asd")
#else
#define asd puts("kek")
#endif

#include<stdio.h>

int main( ) {
    asd;
    getchar( );
    return 0;
}

所以...是的。

【讨论】:

  • 没错,但将包含放在顶部是常识。并且在调用宏之前需要它。
  • @undur_gongor 我也不会把事情按这个顺序排列,但如果有人这样做,我一点也不介意,这就是灵活。
【解决方案2】:

您需要将#include &lt;stdio.h&gt; 添加到您的文件中。

查看here 了解有关此错误消息的更多信息。

【讨论】:

  • 这是错误的,如果它意味着它看起来的意思。确实要#include &lt;stdio.h&gt;,但不一定要在宏定义之前。
  • 习惯的力量。谢谢!
【解决方案3】:

如果要使用printf,则需要包含stdio.h

【讨论】:

    【解决方案4】:

    你应该使用这个语法:

    #include <stdio.h>
    
    #define USE_PRINTF
    
    #ifdef USE_PRINTF
    #define macrofn(str) printf(str)
    #else
    #define macrofn(str) some_statement
    #endif
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 2021-12-14
      相关资源
      最近更新 更多