c-preprocessor相关内容
C# 是否能够像在 C 编程语言中那样使用预处理器语句定义宏?我想简化某些重复语句的常规输入,例如: Console.WriteLine("foo"); 解决方案 不,C# 不支持像 C 这样的预处理器宏.另一方面,Visual Studio 有 snippets.Visual Studio 的代码片段是 IDE 的一项功能,在编辑器中展开,而不是在由预处理器编译的代码中替换.
..
我写了一点 C 语言,我可以很好地阅读它以大致了解它在做什么,但是每次我遇到一个宏时,它都让我彻底崩溃.我最终不得不记住宏是什么,并在阅读时将其替换在脑海中.我遇到的那些直观易懂的总是像迷你函数一样,所以我一直想知道为什么它们不只是函数. 我可以理解需要在预处理器中为调试或跨平台构建定义不同的构建类型,但定义任意替换的能力似乎只会使已经很难理解的语言变得更加难以理解. 为什么要为 C
..
我遇到了一点理论问题.在我维护的一段代码中,有一组宏,例如 #define MAX_OF_2(a, b) (a) >(乙)?(a) : (b)#define MAX_OF_3(a, b, c) MAX_OF_2(MAX_OF_2(a, b), c)#define MAX_OF_4(a, b, c, d) MAX_OF_2(MAX_OF_3(a, b, c), d)...等最多 MAX_OF_8
..
我正在编写一个跨平台代码,它应该在 linux、windows、Mac OS 上编译.在windows上,我必须支持visual studio和mingw. 有一些特定于平台的代码,我应该将它们放在 #ifdef .. #endif 环境中.比如这里我放了win32的具体代码: #ifdef WIN32#include #万一 但是我如何识别 linux 和 mac
..
我正在编写一堆相关的预处理器宏,其中一个生成标签,另一个跳转到.我以这种方式使用它们: MAKE_FUNNY_JUMPING_LOOP(MAKE_LABEL();MAKE_LABEL();) 我需要一些方法来生成唯一标签,每个内部 MAKE_LABEL 调用使用预处理器.我试过使用 __LINE__,但由于我在另一个宏中调用 MAKE_LABEL,它们都有相同的行并且标签会发生冲突. 我
..
在不涉及血淋淋的细节的情况下,我想使用一个 #define 宏,该宏将扩展为一个 #include 但“#"符号会混淆预处理器(如它认为我想引用一个论点.) 例如,我想做这样的事情: #define MACRO(name) #include "name##foo" 然后这样使用它: 宏(测试) 这将扩展为: #include "Testfoo" 不起眼的 # 符号导致预处理器出错
..
我有一个关于 C 中包含守卫的问题.我已经阅读了一些内容,但希望能得到一些澄清. 假设我有一个带有函数定义的头文件“header.h". #ifndef HEADER_FILE#define HEADER_FILE诠释二(无效){返回 2;}#万一 这个头文件有一个包含保护.但是,我对#define HEADER_FILE 实际上在做什么感到困惑.假设我要忘记包含保护,完全忽略添加“#d
..
假设我们有一个像这样的宏 #define FOO(type,name) 类型名称 我们可以像这样使用 FOO(int, int_var); 但并不总是那么简单: FOO(std::map, map_var);//错误:宏“FOO"传递了 3 个参数,但只需要 2 个 当然可以: typedef std::map;map_int_int_t;FOO(map_int_int_t,map
..
我想知道 #define FX_TYPE void (*)(int)typedef void (*stdfx)(int);无效 fx_typ(stdfx fx);/* 行 */无效 fx_def(FX_TYPE fx);/* 错误 */
..
我尝试在以下代码中使用宏 SQR 的定义: #define SQR(x) (x*x)主函数(){整数a,b = 3;a = SQR(b+5);//理想情况下应该替换为 (3+5*5+3),但不确定.printf("%d\n",a);返回0;} 它打印 23.如果我将宏定义更改为 SQR(x) ((x)*(x)),则输出如预期的那样,64.我知道在 C 中调用宏会将调用替换为宏的定义,但我仍然无
..
我已经阅读了很多关于 Stack Overflow 的文章,这些文章回答了“如何从 MSBuild 命令行将预处理器定义传递给编译器"这个问题,它们都给出了以下一些变化: MSBuild.exe/p:DefineConstants=THING_TO_BE_DEFINED 我已经尝试了所有我能想到的变化: MSBuild.exe "/p:DefineConstants=THING_TO_BE_
..
我想做以下等效的事情: #define print_max(TYPE) \# ifdef 类型##_MAX \printf("%lld\n", TYPE##_MAX);\# 万一打印最大(INT); 现在 #ifdef 或任何嵌套的预处理器指令是就我在函数宏中看到的而言,这是不允许的.有什么想法吗? 更新:所以这似乎是不可能的.即使是在运行时检查的 hack 似乎也无法实现.所以我想我
..
据我所知,C 定义 NULL 是这样的: #define NULL ( (void *) 0) 那么,我们应该如何定义 NULL_POINTER 呢?我在我的程序中对其进行了相同的定义并且它起作用了,但我想这只是巧合: #define NULL_POINTER ( (void *) 0) 如果有的话,逻辑定义是什么? 解决方案 #define NULL ( (void *) 0)
..
我在浏览Linux内核的时候发现了一个container_of宏,定义如下: #define container_of(ptr, type, member) ({ \const typeof( ((type *)0)->member ) *__mptr = (ptr);\(type *)( (char *)__mptr - offsetof(type,member) );}) 我明白conta
..
我有脚本编写背景,C 语言的预处理器在我看来总是很丑陋.尽管如此,当我学习编写小型 C 程序时,我还是接受了它.我只是真正使用预处理器来包含我为自己的函数编写的标准库和头文件. 我的问题是,为什么 C 程序员不直接跳过所有包含,而是简单地连接他们的 C 源文件然后编译它?如果您将所有包含的内容放在一个地方,那么您只需定义一次您需要的内容,而不是在您的所有源文件中. 这是我所描述的一个例
..
通常在 C++ 中,当我需要类之间的相互依赖时,我在头文件中使用前向声明,然后在每个 cpp 文件中包含两个头文件. 然而,这种方法在使用模板时会中断.因为模板必须完全在头文件中(不包括将代码放入 cpp 并为每个支持的 T 枚举 template class A 的情况 -这并不总是可行的,例如当 T 是一个 lambda 时). 那么有没有办法在 C++ 中声明/定义相互依赖
..
我想了解编译过程.我们可以使用以下命令查看预处理器中间文件: gcc -E hello.c -o hello.i 或 cpp hello.c >你好我 我大致知道预处理器的作用,但我很难理解某些行中的数字.例如: # 1 "/usr/include/stdc-predef.h" 1 3 4# 1 ""2# 1 "hello.c"# 1 "/usr/include/stdio.h" 1
..
请注意,因为这是一个地狱般的问题;-) 我想在 C 中将模板函数用于泛型集合操作(如搜索、foreach 等),同时保持编译器静态类型检查.当您使用像本例中这样的简单回调时,这是相当简单的: #define MAKE_FOREACH(TYPE)\void foreach_##TYPE (TYPE[n] array, int n, void(*f)(TYPE)) {\for(int i
..
如何实现以下代码所要实现的功能? #include "dir/*" 解决方案 在 Bash 中: HEADER=all_headers.hecho "#ifndef __ALL_HEADERS__";>$头echo "#define __ALL_HEADERS__";>>$头对于 dir/*.h 中的文件做echo "#include ";>>$头完毕回声“#endif">>$头
..
我有一个主目录 A 和两个子目录 B 和 C. 目录B包含一个头文件structures.c: #ifndef __STRUCTURES_H#define __STRUCTURES_Htypedef 结构 __stud_ent__{字符名称[20];int roll_num;}螺柱;#万一 目录C包含main.c代码: #include#include#include int main
..