我知道我可以这样做:
#define MACRO(api, ...) \
bool ret = api(123, ##__VA_ARGS__);
Run Code Online (Sandbox Code Playgroud)
这只是一个例子,它是更复杂的解决方案的一部分.关键是我需要将可变数量的参数附加到第一个123. ##使编译器在123参数之后删除逗号,如果没有参数传递给MACRO.
但现在我想向api附加参数,如下:
#define MACRO(api, ...) \
bool ret = api(__VA_ARGS__##, 456);
Run Code Online (Sandbox Code Playgroud)
诺坎多.一种解决方案是使用两个宏,MACRO和MACRO_V,并使_V版本不处理任何参数.但有没有办法让它与一个宏一起工作?
我是以编程方式生成一堆仿函数,为了保持生成的代码更具可读性,我试图想出一个将扩展以下的宏,
SET_STATE(FunctorA,a,b);
ref a;
ref b;
FunctorA(ref a, ref b){
this->a = a;
this->b = b;
}
Run Code Online (Sandbox Code Playgroud)
基本上它将扩展到第一个参数构造函数.Variadic部分是构造函数的参数数量.是否有可能在宏内部循环并在预处理期间生成此代码,即使它对于这种特殊情况没有意义但我有一些具有20个左右变量的仿函数,他们可以访问它将清理我生成的代码很多.
所有参数都是相同的类型,只有名称会有所不同.
有没有更好的方法来"重载"像这样的宏?我需要一个接受各种参数的宏.
#define DEBUG_TRACE_1(p1) std::string p[] = {p1}; log _log(__FUNCTION__, p, 1)
#define DEBUG_TRACE_2(p1, p2) std::string p[] = {p1, p2}; log _log(__FUNCTION__, p, 2)
#define DEBUG_TRACE_3(p1, p2, p3) std::string p[] = {p1, p2, p3}; log _log(__FUNCTION__, p, 3)
#define DEBUG_TRACE_4(p1, p2, p3, p4) std::string p[] = {p1, p2, p3, p4}; log _log(__FUNCTION__, p, 4)
#define DEBUG_TRACE_5(p1, p2, p3, p4, p5) std::string p[] = {p1, p2, p3, p4, p5}; log _log(__FUNCTION__, p, 5)
Run Code Online (Sandbox Code Playgroud)
这样称呼
DEBUG_TRACE_2("more", "params");
Run Code Online (Sandbox Code Playgroud) 我是C预处理器的新手.是否有可能改变提供给函数的参数的大小写#define?例如,我想写test(size),然后在结果替换中涉及"大小".
为了调试方便,我编写了以下宏
1 #ifndef DEF_H
2 #define DEF_H
3 #define DEBUG_MODE
4 #define DEBUG_INFO(message) \
5 #ifdef DEBUG_MODE \
6 cout << message << endl; \
7 #endif \
8 #endif
Run Code Online (Sandbox Code Playgroud)
但gcc抱怨如下
def.h:4: error: '#' is not followed by a macro parameter
def.h:1: error: unterminated #ifndef
Run Code Online (Sandbox Code Playgroud)
这段代码有什么问题?我在这里错过了一些重点吗?
在qt文档中找到这个.有什么区别
#if defined(Foo) && Foo == 0
Run Code Online (Sandbox Code Playgroud)
和
#if Foo - 0 == 0
Run Code Online (Sandbox Code Playgroud)
据我所知,如果Foo未定义,后者也将是假的?我在哪里可以读到这个?
今天晚上我正在阅读一些用C编写的代码,文件顶部是类似函数的宏HASH:
#define HASH(fp) (((unsigned long)fp)%NHASH)
Run Code Online (Sandbox Code Playgroud)
这让我想知道,为什么有人会选择使用类似函数的宏来实现这种函数,而不是将它作为常规的vanilla C函数实现?每种实施的优缺点是什么?
谢谢你!
如何在C中的指令中编写for/ whileloop #define?
我有一个我需要宏功能的功能.该函数包含临时变量,我不记得是否有关于在宏替换中使用临时变量的规则.
long fooAlloc(struct foo *f, long size)
{
long i1, i2;
double *data[7];
/* do something */
return 42;
}
Run Code Online (Sandbox Code Playgroud)
MACRO表格:
#define ALLOC_FOO(f, size) \
{\
long i1, i2;\
double *data[7];\
\
/* do something */ \
}
Run Code Online (Sandbox Code Playgroud)
这个可以吗?(即没有令人讨厌的副作用 - 除了通常的那些:不是"类型安全"等).顺便说一句,我知道"宏是邪恶的" - 在这种情况下我只需要使用它 - 没有多少选择.
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))
Run Code Online (Sandbox Code Playgroud)
这是这两个宏的定义; 在后面的代码LOGI,并LOGW使用这种方式
LOGI("accelerometer: x=%f y=%f z=%f",
event.acceleration.x, event.acceleration.y,
event.acceleration.z);
Run Code Online (Sandbox Code Playgroud)
就这样
LOGW("Unable to eglMakeCurrent");
Run Code Online (Sandbox Code Playgroud)
因为我试图避免复杂的宏,#define一般来说,我无法得到这个宏实际意味着什么.这里的3点符号有什么作用?这#define在代码后面有什么变化?
显然我知道3个点用于表示和无限量的参数,但我不知道如何阅读这种情况.