Tag: macros

有条件的“pragma omp”

我正在尝试使用OpenMP进行不同类型的并行化。 结果我在我的代码中有几行#pragma omp parallel for ,我(un-)评论交替。 有没有办法使这些行有条件的类似下面的东西,而不是工作代码? define OMPflag 1 #if OMPFlag pragma omp parallel for for …

Linux内核的__is_constexpr宏

Linux Kernel的__is_constexpr(x)宏如何工作? 它的目的是什么? 什么时候介绍? 为什么要介绍? /* * This returns a constant expression while determining if an argument is * a constant expression, most importantly without evaluating the argument. * Glory to Martin Uecker */ #define __is_constexpr(x) \ (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8))) 有关解决相同问题的不同方法的讨论 ,请参阅: 检测宏中的整数常量表达式

在其他编译器中等同于MSVC的_countof?

是否有其他编译器提供的_countof内置等价物,尤其是GCC和Clang? 有没有非宏观forms?

为什么这个连接宏需要一个间接级别?

我找到了一篇有趣的小博文 ,解释了如何使用行号在宏中生成(半)唯一名称: // Do magic! Creates a unique name using the line number #define LINE_NAME( prefix ) JOIN( prefix, __LINE__ ) #define JOIN( symbol1, symbol2 ) _DO_JOIN( symbol1, symbol2 ) #define _DO_JOIN( symbol1, symbol2 ) symbol1##symbol2 这里有两件事让我很困惑: 为什么如果在文件中声明JOIN后, LINE_NAME宏甚至可以工作? 我认为C预处理器进行了线性传递,因此需要根据依赖性来定义宏,就像C函数在使用之前需要定义一样。 为什么有必要同时使用JOIN和_DO_JOIN宏来获得正确的结果? 在宏中具有这种间接级别似乎很奇怪。 我有一种感觉,这两个问题的答案是相关的,并且与C预处理器评估宏的方式有关。 (但是,由于我甚至认为这个例子无效,我对宏如何工作的直觉显然已经过时了。)

一个malloc在C中有多大?

我在C中有一个malloc,它是26901 ^ 2 * sizeof(double) 这让我想到这里最大的价值是什么? 另外,定义宏来访问这个2D数组有什么问题吗? #define DN(i,j) ((int)i * ny + (int)j) 因为这对我来说似乎不起作用 – 或者我至少不确定是这样。 我无法弄清楚如何在宏上进行全视图潜水,告诉我A [DN(indx,jndx)]实际上是在看什么。

传入_Generic宏的不兼容的指针类型

以下代码生成2个警告,这些警告在问题标题中描述。 #include static void _print_f(float *f){printf(“float : %f\n”, *f);} static void _print_i(int *i) {printf(“int : %d\n”, *i);} #define print(num) _Generic((num), \ int* : _print_i(num), \ float* : _print_f(num)) int main(void) { print((&(int){10})); print((&(float){10.f})); return 0; } OUTPUT: int : 10 float : 10.000000 我知道,这个宏可以写成如下: #define print(num) _Generic((num), \ int* : _print_i, \ float* : _print_f)(num) […]