Tag: c preprocessor

是否有一个C预处理器宏来打印结构?

据我所知,没有办法在C中打印出一个struct值。 即,这不会飞: typedef struct { int a; double b; } stype stype a; aa=3; ab=3.4; printf(“%z”, a); 相反,你必须说: printf(“a: %d\n”, aa); printf(“b: %f\n”, ab); 这似乎是一个完美的地方,你可以使用宏来保存任意结构的大量输入。 C预处理器是否足以执行此转换?

Cmake – 想要查看中间.i文件

我想知道如何让Cmake给我一个目标,允许我从我的C程序中保存.i文件,并完成宏扩展等。 我是否需要制作自定义目标才能执行此操作?

-fopenmp提供了什么预处理器定义?

我有一些可以运行(或不运行)OpenMP的代码 – 它取决于用户如何设置makefile。 如果他们想要使用OpenMP运行,那么他们只需将-fopenmp添加到CFLAGS和CXXFLAGS 。 我正在尝试确定在-fopenmp生效时我可以用什么预处理器宏来判断。 omp.h标头看起来不是很有趣: $ cat /usr/lib/gcc/x86_64-linux-gnu/4.8/include/omp.h | grep define #define OMP_H 1 #define _LIBGOMP_OMP_LOCK_DEFINED 1 # define __GOMP_NOTHROW throw () # define __GOMP_NOTHROW __attribute__((__nothrow__)) 我无法让预处理器提供任何有用的东西: $ cpp -dM -fopenmp </dev/null | grep -i omp #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1 #define __STDC_IEC_559_COMPLEX__ 1 $ cpp […]

是否可以使用预处理器对数组进行排序?

我有很多很长的数组。 无法进行运行时排序。 手动排序也很耗时。 此外,可以在以后以任何顺序添加新元素,因此我想使用C预处理器按值对它们进行排序,或者可能有任何编译器标志(GCC)? 例如: sometype S[] = { {somevals, “BOB”, someothervals}, {somevals, “ALICE”, someothervals}, {somevals, “TIM”, someothervals}, } 必须排序如下: sometype S[] = { {somevals, “ALICE”, someothervals}, {somevals, “BOB”, someothervals}, {somevals, “TIM”, someothervals}, } 解决了 好的,这是我的解决方案: 手动将每个数组复制并粘贴到名为tobesorted.c的临时文件中 按第二列sort -b -i –key=2 tobesorted.c : sort -b -i –key=2 tobesorted.c 将输出复制并粘贴回原始文件。 实际上,有一种可能性直接从预处理器调用“排序”会很好(我希望至少GCC能以某种方式支持这些function,但似乎它没有)。

如何让Xcode 8 C预处理器忽略// #defines中的注释

C预处理器( cpp )似乎应该正确处理此代码: #define A 1 // hello there int foo[A]; 我希望将A替换为1 。 会发生什么是A替换为1 // hello there ,这导致cpp -std=c99 test.c的以下输出: # 1 “test.c” int foo[1 // hello there]; 哪个是无效的C并且无法编译。 如何让cpp执行正确的替换? 关于编译器的注意事项:在mac上使用最新的(8.2.1,2016年12月)Xcode中的cpp ,所以我怀疑它是由于过时的编译器造成的。

如何编写安全且用户友好的c / c ++ #define宏

我一直在考虑如何编写宏以确保安全,可读和直观。 正确使用它们应该通过它们的外观来理解,如果使用不正确,编译器应该告诉你,而不是让你引入一个模糊的bug。 在编写多行定义宏时,我通常会发现自己像这样构造它们以满足所需的标准: #define macro(x) do{ \ … some code line ; \ … some code line ; \ }while(0) 这样你就可以…… if (a) { macro(a); } 和… if (a) macro(a); else { … } 这个的一个很好的function是,如果你错误地使用它们,你将收到编译器错误。 这不会编译例如: if (a) macro(a) else b(); 但是,我看到SW开发人员阅读了这种宏构造,并对它感到非常困惑。 您是否可以考虑使用其他方法编写宏,这些宏不会以某种方式欺骗用户,而是在他们执行非预期的操作时,并且在浏览新代码时仍然可以理解? 另外,你能找到do {} while(0)方法的任何问题吗? 例如,您可能希望宏以某种方式运行,而情况并非如此。 我不完全相信do {} while(0)方法是一个好习惯的原因是,宏本身看起来有点奇怪,并且对任何以前没有看过该构造的人(至少某些人)做了一些解释。 编辑: 以下是我喜欢的评论中的一个链接(谢谢!)的示例。 我觉得这很可读: #define MYMACRO(a,b) […]

我可以在中间而不是结尾使用__VA_ARGS定义可变参数C预处理器宏吗?

如果我这样做,海湾合作委员会会抱怨: #define M(obj,met, …, contents) obj##_##met(const void * self, __VA_ARGS__) { \ contents \ } 给我这两个理由: error: missing ‘)’ in macro parameter list warning: __VA_ARGS__ can only appear in the expansion of a C99 variadic macro 显然,C99样式的可变参数宏在省略号之后立即期望右括号,有效地要求可变参数列表是宏的最后一个参数。 我需要它在中间来产生我在上面的宏中描述的速记符号。 GCC是否支持此function,使用另一种(非C99)可变参数宏样式? 我可以模仿它在其他地方做吗? 我最后不想要可变列表,它会让我的符号混乱。 我只能使用GCC。

C中类似函数的宏定义

我想定义像MACRO这样的函数。 即 #define foo(x)\ #if x>32\ x\ #else\ (2*x)\ #endif 那是, if x>32, then foo(x) present x else, foo(x) present (2*x) 但我的海湾合作委员会抱怨: int a = foo(31); 我认为C预处理器应该正确处理。 因为在编译时,它知道x=33 。 它可以用(2*33)代替foo(33) (2*33)

C预处理器使用父宏的右括号

我有这个代码有效: #include #define A(x) x B #define B(x) C(x, #define C(x,y) yx) int main( void ) { printf( A(“1”) (“2”) “3” ); } 它打印132 ( A宏的点是交换括号中跟随其参数的东西,之后的所有内容,直到另一个结束括号) 但如果我在另一个宏中使用它: #define Z(x) x printf( Z( A(“1”) (“2”) “3” ) ); 我得到编译错误“未终止的函数式宏调用”。 我意识到这是因为编译器试图独立处理Z的参数,但我需要使用它的右括号作为标记。 有没有办法让我在宏中工作? 更改调用语法实际上不是一个选项。 ps在我得到任何回复谈论这是多么糟糕的事情之前,请放心:这不是真正的代码。 制作玩具程序时出现了一个问题,该程序使用define来模拟C语言中的新语言。

像#include这样的预处理器指令是否只能放在程序代码的顶部?

我在函数内部使用了#pragma指令,没有错误或警告(特别是#pragma pack() )。但是下面的代码显示了incompatible implicit declaration of built-in function ‘printf’|的警告incompatible implicit declaration of built-in function ‘printf’| : int main(void) { printf(“Trial”); } #include 此外,这里是我所拥有的一本书的摘录。作者对SO的评价很差,特别是对于他对void main()慷慨使用,但我觉得没有作者可以如此不好地声称以下内容: 这些预处理程序指令中的每一个都以#符号开头。 指令可以放在程序的任何位置,但通常放在程序的开头,在第一个函数定义之前。 那么你能否告诉我是否必须在程序的顶部使用#include之类的预处理程序指令,而其他像#pragma这样的程序可以在程序的任何地方使用? 编辑在OUAH的评论之后我尝试了以下内容,但它没有发出警告,它给出了一大堆错误 .LOL。 int main(void) { #include printf(“Trial”); }