为了调试方便,我编写了以下宏
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)
这段代码有什么问题?我在这里错过了一些重点吗?
考虑以下玩具示例,其中A
是以n x 2
列主要顺序存储的矩阵,我想计算其列总和.sum_0
仅计算第1列的总和,同时sum_1
也计算第2列的总和.这实际上是一个人为的例子,因为基本上不需要为这个任务定义两个函数(我可以编写一个带有双循环嵌套的函数,其中外循环从中迭代0
到j
).它的构建是为了演示我现实中的模板问题.
/* "test.c" */
#include <stdlib.h>
// j can be 0 or 1
static inline void sum_template (size_t j, size_t n, double *A, double *c) {
if (n == 0) return;
size_t i;
double *a = A, *b = A + n;
double c0 = 0.0, c1 = 0.0;
#pragma omp simd reduction (+: c0, c1) aligned (a, b: 32)
for (i = 0; i < …
Run Code Online (Sandbox Code Playgroud) 我想使用这样的宏参数:
#define D(cond,...) do{ \
#if cond \
#define YYY 1 \
#else \
#define YYY 0 \
} while(0)
Run Code Online (Sandbox Code Playgroud)
是否可以?
UPD
也许当源将被预处理两次时:gcc -E source.c | gcc -xc -
下一步将起作用:
#define D(cond,...) #define YYY cond&DEBUG
#if YYY
#define D(...) printf( __VA_ARGS__ )
#else
#define D(...)
#endif
Run Code Online (Sandbox Code Playgroud)