我有一个多个类,每个类都有不同的成员变量,这些变量在构造函数中被简单地初始化.这是一个例子:
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预处理器:在#define中使用#if?
是否有任何技巧可以在定义的rhs内部使用预处理程序指令?问题是,预处理器将所有rhs折叠成一条长行.但也许有一招?
在rhs中我想要的例子是
#define MY_CHECK \
#ifndef MY_DEF \
# error MY_DEF not defined \
#endif
Run Code Online (Sandbox Code Playgroud)
?
目的是简短:使用1行快捷方式而不是多行检查序列.
我坐在一些遗留代码上,通过#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) 使用单元测试框架,我遇到了一个我想测试宏参数的情况.简单地说,我想扩展宏观FOO(x),这FOO(int)将是short和FOO(anything_else)将来的long.
使用C++模板,当然这不是问题.但在这里我需要一个真正的令牌替代品,而不仅仅是一个typedef.即FOO(char) FOO(char) i;应该是一个有效的定义等于long long i;.
我正在尝试做一些概念上与此相似的事情,但似乎无法让它发挥作用(最后显示的错误)任何想法?
#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中的宏函数中实现宏条件。
#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代码库中.这些调试输出语句将由编译器选项开关控制.
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) 我目前正在开发一个我打算移植的程序。我可以访问 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。
我发现两个有些相关的问题:
但他们都没有回答我的问题,因为他们试图完成不同的事情。
所以我的问题是:如果允许的话,如何在宏内部使用预处理器 if 语句?如果不可能,我该怎么做才能获得这个损坏的DEBUG_BREAK宏试图执行的相同功能?
注:DEBUG编译时定义,用于调试;编译发布时未定义它。