Tag: c预处理器

在C宏中,两个相邻的磅符号意味着什么?

我正在看一个定义了大量常量数组的应用程序。 令我困惑的是在宏观中使用彼此相邻的两个磅标志。 例如: #define r0(p,q,r,s) 0x##p##q##r##s 那两个磅标志是什么意思?

如何通过C预处理器(cpp)生成列表?

我想做类似以下的事情: F_BEGIN F(f1) {some code} F(f2) {some code} … F(fn) {some code} F_END 并让它产生以下 int f1() {some code} int f2() {some code} … int fn() {some code} int (*function_table)(void)[] = { f1, f2, …, fn }; function本身很容易。 我似乎无法做的是跟踪函数表的所有名称,直到最后。 我看了这个问题和这个问题,但我无法为我工作。 有任何想法吗?

#define如何工作? CUBE(y)y *(y * y)的奇怪结果

#include #include #define CUBE(y)y*(y*y) main() { int j; j = CUBE(-2+4); printf(“value of j = %d”,j); getch(); } 此代码的输出为-26 。 我只是想知道这段代码如何给出-26作为输出。 #define如何在此代码中工作。 我知道变量或方法的#define永久修复值,但不知道这对CUBE工作原理。 有人可以一步一步地描述这个,简单的方法。

C中#define预处理器的范围

#define的范围直到文件末尾。 但它从哪里开始。 基本上我尝试了以下代码。 #include #include #define pi 3.14 void fun(); int main() { printf(“%f \n”,pi); #define pi 3.141516 fun(); return 0; } void fun(){ printf(“%f \n”,pi);} 上述程序的输出结果如下 3.140000 3.141416 考虑到主要的预处理,pi的值应该是3.141516并且在主3.14之外。 这是不正确的,但请解释原因。

宏可以评估多个参数到另一个吗?

我想做这样的事情: #define NEED3ARGS(a1,a2,a3) ( “[” #a1 ” + ” #a2 ” + ” #a3 “]” ) #define MULTIARG() ARG1, ARG2, ARG3 NEED3ARGS( MULTIARG() ) 我希望它能输出如下内容: ( “[” “ARG1″ ” + ” “ARG2″ ” + ” “ARG3” “]” ) 但相反,我有: $ cpp multiarg.c # 1 “multiarg.c” # 1 “” # 1 “” # 1 “multiarg.c” multiarg.c:4:23: […]

C预处理器文字构造

我的问题如下: 我有一个像这样的宏编辑的字符串文字 #define TITLE “Title” 但有些情况下,我需要传入此字符串的宽字符变体。 我希望能够将L”Title”传递给这些函数。 很自然地,我试图用TITLE来定义一个新的宏W_TITLE 。 但是我没有运气,我所有的方法(下面列出的)都失败了。 请告诉我如何完成这样的魔术。 我试过了 #define W_TITLE L##TITLE #define W_TITLE #L TITLE #define W_TITLE ##L TITLE 但他们都失败了……

C循环依赖

我在C中有循环依赖这个问题,我查看了关于这个主题的其他问题,但实际上找不到答案。 我有第一个名为vertex的结构: #ifndef MapTest_vertex_h #define MapTest_vertex_h #include “edgelist.h” //includes edgelist because it’s needed typedef struct { char* name; float x, y; edgelist* edges; } vertex; #endif 第二个结构是顶点包含的边缘列表。 #ifndef edgelist_h #define edgelist_h #include “edge.h” //include edge, because its needed typedef struct _edgelist { edge** edges; int capacity, size; } edgelist; //… #endif 然后是最后一个结构,即问题引发的结构,边结构包含在上面的边缘列表中。 #ifndef MapTest_edge_h #define […]

C语言中宏定义的良好编程实践(#define)

例如,永远不要像这样定义一个宏: #define DANGER 60 + 2 当我们执行这样的操作时,这可能是危险的: int wrong_value = DANGER * 2; // Expecting 124 相反,定义这样,因为你不知道宏的用户如何使用它: #define HARMLESS (60 + 2) 这个例子很简单,但这几乎解释了我的问题。 在编写宏时,您会建议使用哪些指南或最佳实践吗? 谢谢你的时间!

为什么#define不需要分号?

我在C中编写了一些测试代码。 我错了,我插了一个; 在#define ,这给了我错误。 为什么#define s不需要分号? 进一步来说 : 方法1:有效 const int MAX_STRING = 256; int main(void) { char buffer[MAX_STRING]; } 方法2:不起作用 – 编译错误。 #define MAX_STRING 256; int main(void) { char buffer[MAX_STRING]; } 这些代码行为不同的原因是什么? 那些MAX_STRING都不是常量吗?

什么是在C(或可能是C ++)中记录X-Macros使用模式的好参考?

C预处理器的维基百科条目中给出了“ X-Macros ”的基本定义和示例以及一些参考: X-Macro是一个头文件(通常使用“.def”扩展名而不是传统的“.h”),它包含一个类似的宏调用列表(可以称为“组件宏”)。 关于如何使用这种强大技术的一些很好的信息来源是什么? 是否有使用此方法的着名开源库?