小编a3f*_*a3f的帖子

附加到__VA_ARGS__

我知道我可以这样做:

#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版本不处理任何参数.但有没有办法让它与一个宏一起工作?

c gcc c-preprocessor variadic-macros

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

迭代变量宏观参数

我是以编程方式生成一堆仿函数,为了保持生成的代码更具可读性,我试图想出一个将扩展以下的宏,

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个左右变量的仿函数,他们可以访问它将清理我生成的代码很多.

所有参数都是相同的类型,只有名称会有所不同.

c c++ c-preprocessor

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

重载C宏

有没有更好的方法来"重载"像这样的宏?我需要一个接受各种参数的宏.

#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 c++ overloading c-preprocessor

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

更改提供给C预处理器宏的参数的大小写

我是C预处理器的新手.是否有可能改变提供给函数的参数的大小写#define?例如,我想写test(size),然后在结果替换中涉及"大小".

c c-preprocessor

12
推荐指数
1
解决办法
2181
查看次数

为什么编译器会抱怨这个宏声明

为了调试方便,我编写了以下宏

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)

这段代码有什么问题?我在这里错过了一些重点吗?

c debugging c-preprocessor

12
推荐指数
1
解决办法
1万
查看次数

"#if Foo - 0 == 0"和"#if defined(Foo)&& Foo == 0"有什么区别?

qt文档中找到这个.有什么区别

#if defined(Foo) && Foo ==  0
Run Code Online (Sandbox Code Playgroud)

#if Foo - 0 ==  0
Run Code Online (Sandbox Code Playgroud)

据我所知,如果Foo未定义,后者也将是假的?我在哪里可以读到这个?

c c++ qt c-preprocessor

12
推荐指数
1
解决办法
697
查看次数

何时在C中使用类似函数的宏

今天晚上我正在阅读一些用C编写的代码,文件顶部是类似函数的宏HASH:

#define HASH(fp) (((unsigned long)fp)%NHASH)
Run Code Online (Sandbox Code Playgroud)

这让我想知道,为什么有人会选择使用类似函数的宏来实现这种函数,而不是将它作为常规的vanilla C函数实现?每种实施的优缺点是什么?

谢谢你!

c function c-preprocessor

11
推荐指数
3
解决办法
1万
查看次数

fordefine指令中的for或while循环

如何在C中的指令中编写for/ whileloop #define

c for-loop c-preprocessor

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

C宏可以包含临时变量吗?

我有一个我需要宏功能的功能.该函数包含临时变量,我不记得是否有关于在宏替换中使用临时变量的规则.

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)

这个可以吗?(即没有令人讨厌的副作用 - 除了通常的那些:不是"类型安全"等).顺便说一句,我知道"宏是邪恶的" - 在这种情况下我只需要使用它 - 没有多少选择.

c c-preprocessor

11
推荐指数
4
解决办法
2万
查看次数

C中的#define有三个点

#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个点用于表示和无限量的参数,但我不知道如何阅读这种情况.

c label notation c-preprocessor variadic-macros

11
推荐指数
1
解决办法
6847
查看次数