相关疑难解决方法(0)

C++预处理器:避免代码重复成员变量列表

我有一个多个类,每个类都有不同的成员变量,这些变量在构造函数中被简单地初始化.这是一个例子:

struct Person
{
    Person(const char *name, int age)
        :
        name(name),
        age(age)
    {
    }
private:
    const char *name;
    int age;
};
Run Code Online (Sandbox Code Playgroud)

每个都有一个相关的print<>()功能.

template <>
void print<Person>(const Person &person)
{
    std::cout << "name=" << name << "\n";
    std::cout << "age=" << age << "\n";
}
Run Code Online (Sandbox Code Playgroud)

由于参数列表在四个位置复制,因此该代码容易出错.如何重写代码以避免重复?我想使用预处理器和/或模板.

例如,我可以使用X-args预处理器技术 - 类似这样的东西吗?

#define ARGUMENTS \
    ARG(const char *, name) \
    ARG(int, age)

struct Person
{
    Person(LIST_TYPE_NAME_COMMA(ARGUMENTS))
       :
       LIST_NAME_INIT(ARGUMENTS)
    {
    }
private:
    LIST_TYPE_NAME_SEMICOLON(ARGUMENTS)
};

template <>
void print<Person>(const Person &person)
{
   LIST_COUT_LINE(ARGUMENTS)
} …
Run Code Online (Sandbox Code Playgroud)

c++ templates arguments c-preprocessor

60
推荐指数
2
解决办法
3万
查看次数

预处理器指令里面定义?

可能重复:
C预处理器:在#define中使用#if?

是否有任何技巧可以在定义的rhs内部使用预处理程序指令?问题是,预处理器将所有rhs折叠成一条长行.但也许有一招?

在rhs中我想要的例子是

#define MY_CHECK \
  #ifndef MY_DEF  \
  # error MY_DEF not defined  \
  #endif
Run Code Online (Sandbox Code Playgroud)


目的是简短:使用1行快捷方式而不是多行检查序列.

c-preprocessor

10
推荐指数
2
解决办法
9457
查看次数

#if在#define里面?

我坐在一些遗留代码上,通过#defines生成大量代码.现在我知道不可能有一个#ifdef内部#define,但#if可能吗?我想为特定类型添加一些特化.(没有像使用模板那样进行重大更改).以下示例给出了隐秘错误,因此不是这样的:

#define MK_GET(type) \
  type get_ ## type (int index) \
  { \
    #if type == double \  <-- what i want to add
      specialized code... \
    #endif
    ...
  } \

MK_GET(double);
MK_GET(int);
MK_GET(string);
Run Code Online (Sandbox Code Playgroud)

c++ c-preprocessor preprocessor-directive

6
推荐指数
1
解决办法
5797
查看次数

我可以有条件地替换预处理器参数吗?

使用单元测试框架,我遇到了一个我想测试宏参数的情况.简单地说,我想扩展宏观FOO(x),这FOO(int)将是shortFOO(anything_else)将来的long.

使用C++模板,当然这不是问题.但在这里我需要一个真正的令牌替代品,而不仅仅是一个typedef.即FOO(char) FOO(char) i;应该是一个有效的定义等于long long i;.

c c++ c-preprocessor

6
推荐指数
1
解决办法
275
查看次数

C编程:预处理器,宏作为标记

我正在尝试做一些概念上与此相似的事情,但似乎无法让它发挥作用(最后显示的错误)任何想法?

#include <stdio.h>

int main( int argc , char const *argv[] )
{
  int abc_def_ghi = 42;
  #define SUFFIX ghi
  #define VAR(prefix) prefix##_def_##SUFFIX
  printf( "%d\n" , VAR(abc) );
  return 0;
}

// untitled:8: error: ‘abc_def_SUFFIX’ undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)

c macros token stringification c-preprocessor

2
推荐指数
2
解决办法
3358
查看次数

C中的宏条件语句

是否有可能在C中的宏函数中实现宏条件。

#define fun(x)
#if x==0
    fun1;
#else
    fun2;
#endif

#define fun1 // do something here
#define fun2 // do something else here
Run Code Online (Sandbox Code Playgroud)

换句话说,预处理器根据参数值决定要使用哪个宏。

fun(0) // fun1 is "preprocessed"
fun(1) // fun2 is "preprocessed"
Run Code Online (Sandbox Code Playgroud)

我知道此示例不起作用,但我想知道是否可以使其以某种方式起作用?

M.

c macros conditional c-preprocessor

2
推荐指数
1
解决办法
3343
查看次数

如何编写一个扩展为`#ifdef ... #endif`宏块的C宏?

我想将一些调试输出语句插入到一个大的C代码库中.这些调试输出语句将由编译器选项开关控制.

debug输出语句如下所示:

#ifdef DEBUG_FLAG
 Print(someSymbol)
#endif
Run Code Online (Sandbox Code Playgroud)

为了节省一些打字,我想知道是否可以定义一个扩展到上面的调试输出语句块的简单宏?

例如:

#define DBG_MACRO(someSymbol)  (something that can expand to above)
Run Code Online (Sandbox Code Playgroud)

c macros

1
推荐指数
2
解决办法
256
查看次数

C++ - 如何在宏内使用预处理器 if 语句(#if、#elif、#endif)?

我目前正在开发一个我打算移植的程序。我可以访问 Windows 和 macOS,并且我希望能够在两者上轻松调试。当错误处理时,我希望在那里有调试中断以使其变得容易(__debugbreak()对于 MSVC)。由于我打算在多个平台上进行开发和测试,因此我想制作一个宏来执行以下操作:

#define DEBUG_BREAK #ifdef DEBUG\
    #if _MSC_VER                \
        __debugbreak();         \
    #elif __GNUC__              \
        __builtin_trap();       \
    #endif                      \
#endif
Run Code Online (Sandbox Code Playgroud)

DEBUG_BREAK因此,在任何平台上调试时,我可以在任何想要破坏代码的地方编写代码。当我使用这个宏时,我收到错误'#' not expected here

我发现两个有些相关的问题:

  1. 如何在 C 预处理器中的#define 中使用#if?
  2. C 预处理器 #if 表达式

但他们都没有回答我的问题,因为他们试图完成不同的事情。

所以我的问题是:如果允许的话,如何在宏内部使用预处理器 if 语句?如果不可能,我该怎么做才能获得这个损坏的DEBUG_BREAK宏试图执行的相同功能?

注:DEBUG编译时定义,用于调试;编译发布时未定义它。

c++ macros visual-c++ preprocessor-directive

0
推荐指数
1
解决办法
135
查看次数