c - 是否可以在宏中定义宏?

标签 c macros

我想使用这样的宏参数:

  #define D(cond,...) do{         \
    #if cond                      \
    #define YYY 1                 \
    #else                         \
    #define YYY 0                 \
  } while(0)

是否可以?

UPD
也许什么时候源会被预处理两次:gcc -E source.c | gcc -xc -接下来将工作:
#define D(cond,...) #define YYY cond&DEBUG
#if YYY
#define D(...) printf( __VA_ARGS__ )
#else
#define D(...)
#endif

最佳答案

这不可能。 阅读 GNU cpp preprocessor和 C11 标准(即 n1570),并检查 here . C preprocessor是(至少在概念上)在编译器的其余部分之前运行(它获取您的 translation unit 的预处理形式)。顺便说一句,对于文件 foo.c你可以用 gcc -C -E foo.c > foo.i (使用 GCC )进入 foo.i它的预处理形式,您可以检查 foo.i - 因为它是一个文本文件 - 带有寻呼机或编辑器。

然而, .c文件可以生成 (生成 C 代码是一种常见的做法,至少从 1980 年代开始;例如使用 yaccbisonrpcgenswig ,....;许多大型软件项目使用专门的 C 或 C++ 生成器代码...)。您可能会考虑使用其他工具,也许是 GPP预处理器(或 GNU m4 )或其他一些程序或脚本,以生成您的 C 文件(从其他东西)。也看看 autoconf (它可能有与您相似的目标)。

您可能想配置您的 build automation用于此目的的工具,例如编辑您的 Makefile GNU make .

关于c - 是否可以在宏中定义宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48431325/

相关文章:

macros - 带有字符串文字前缀的预处理器字符串化运算符

c - 无符号常量变量?无符号常量是什么?

c - 多线程启动顺序

c - 以下宏的返回值是多少

macros - 向 Clojure 的 defrecord 构造函数添加功能的推荐宏?

Python Jinja2 宏空白问题

c++ - 使用模板没有开销的派生类?

c++ - Google 测试 (gtest) `EXPECT_TRUE()` 宏不会使用 `std::is_same<>` 模板作为输入进行编译

c - 从 GDB 获取堆栈跟踪

c - 释放的内存不会导致页面错误