【问题标题】:C selective #defineC选择性#define
【发布时间】:2012-05-04 21:50:55
【问题描述】:

我想知道 C 是否允许设置选择性#define。 这就是我所说的选择性: 如果我定义了一个结构:

typedef struct mystruct{  
int (*pointer_function)(struct mystruct* ,struct mystruct);
...
} mystruct;

// and I have:
int main () {
mystruct s1, s2;
// when I do:
s1 = s2;
// I want my #define to recognize that on the left side
// I have mystruct type and use s1.pointer_function(&s1,s2);
}

【问题讨论】:

    标签: c c-preprocessor


    【解决方案1】:

    我什至不确定您要定义哪个符号,s1s2。这并不重要,在任何一种情况下,您都需要替换其中一个您需要的名称,这样它就不起作用了。

    【讨论】:

      【解决方案2】:

      您可以在 C11 中使用 _Generic 语法执行此操作。

      #define MY_MACRO(x, y) _Generic((x), \
          mystruct: (x).pointer_function(&(x), (y)), \
          )
      

      您不能在 C99 或 C89 中执行此操作。我还不知道任何具有良好 C11 支持的编译器,所以这段代码还不会编译一两年。来自 GCC 文档 (source):

      GCC 对该标准的某些部分提供有限的不完全支持,通过 -std=c11 或 -std=iso9899:2011 启用。

      【讨论】:

        【解决方案3】:

        #define 执行简单的字符串替换。它不依赖于上下文。你不能这样做。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-20
          • 2013-07-24
          • 2017-06-09
          • 1970-01-01
          相关资源
          最近更新 更多