如何知道您所在的宏上下文

时间:2016-03-16 14:21:30

标签: c c-preprocessor

例如:

#define MY_TEST_FUNCTION
#ifdef MY_TEST_FUNCTION
void __MACRO_NAME##_TEST (void *)
{

}
#endif

这应该产生:

#ifdef MY_TEST_FUNCTION
void MY_TEST_FUNCTION_TEST (void *)
{

}
#endif

这就像 func ,我们在函数中获取函数名称。这可能吗?

3 个答案:

答案 0 :(得分:2)

语言标准中没有定义这样的占位符。

知道你刚检查过的宏,所以我不知道这样的占位符即使存在也会如此有用。

还要考虑......

#if defined( FOO ) || defined( BAR )

......“背景”应该被命名为什么?

答案 1 :(得分:1)

您假设太多的宏包含系统。 (无变量)宏只是用一个字符串替换一个名称。没有“当前宏上下文”,只是宏名称及其替换字符的映射。标题宏保护没有比EXIT_FAILURE之类的任何宏更加特殊(stdlib.h)。

#ifdef#ifndef只测试是否使用给定名称定义宏,任何宏。

因此,如果您想拥有“标题宏上下文”,则必须在标题的开头手动设置它。

或许你的问题可以通过参数宏来解决。

#define function_variation( suffix ) int function_##suffix() {\
  ... \
}

答案 2 :(得分:0)

一种功能的单一宏就足够了

 public class ProductsTable
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public ICollection<RxTable> RxTable { get; set; }
}

public partial class DrugsTable
{

    public int DrugID { get; set; }
    public string Strength { get; set; }
    public string GCNSeqNo { get; set; }

    public virtual ICollection<RxTable> RxTable { get; set; }

}

public class Person
{
    public int PersonID { get; set; }

    public virtual ICollection<RxTable> RxTable { get; set; }
}

public class RxTable
{
    [Key, Column(Order = 0)]
    public int ProductID { get; set; }
    [Key, Column(Order = 1)]
    public int DrugID { get; set; }
    [Key, Column(Order = 2)]
    public int PersonID { get; set; }

    public virtual ProductsTable ProductsTable { get; set; }
    public virtual DrugsTable DrugsTable { get; set; }
    public virtual Person Person { get; set; }
}