Tag:

为什么我没有在以下c程序中获得预期的输出?

可能重复: “#define STR(a)#a”有什么作用? c编程语言中的宏评估 #include #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf(“%s\n”,h(f(1,2))); printf(“%s\n”,g(f(1,2))); return 0; } 我期待printf的输出相同。 但我得到的是不同的(如下所示) 12 f(1,2) 有人可以解释是什么原因以及为什么会发生这种情况?

如何写一个’clamp’/’clip’/’bound’宏来返回给定范围内的值?

我经常发现自己在写类似的东西 int computedValue = …; return MAX(0, MIN(5, computedValue)); 我希望能够将其写为单个单行宏。 它必须没有副作用,就像现有的系统宏MIN和MAX一样,并且应该适用于与MIN和MAX相同的数据类型。 任何人都可以告诉我如何将其变成一个宏吗?

为什么在C中定义具有相同名称和内容的宏?

我正在研究Linux内核头文件中的if_link.h ,它包含这个枚举: enum { IFLA_UNSPEC, IFLA_ADDRESS, IFLA_BROADCAST, IFLA_IFNAME, IFLA_MTU, IFLA_LINK, IFLA_QDISC, IFLA_STATS, IFLA_COST, #define IFLA_COST IFLA_COST IFLA_PRIORITY, #define IFLA_PRIORITY IFLA_PRIORITY IFLA_MASTER, #define IFLA_MASTER IFLA_MASTER …. } 定义看起来没用; 他们的目的是什么? 为什么只有一些项目有定义?

我可以附加到预处理器宏吗?

在标准C或GNU扩展中有什么方法可以将内容附加到宏定义中吗? 例如 ,给定宏定义为 #define List foo bar 我可以追加bas以便List扩展,就像我定义它一样 #define List foo bar bas ? 我希望我能做到这样的事情: #define List foo bar bas #define List_ Expand(List) #undef List #define List Expand(List_) quux 但我无法弄清楚如何定义Expand()宏,所以它会做我想要的。 动机:我正在沿着以下方面玩歧视/标记的联盟: struct quux_foo { int x; }; struct quux_bar { char *s; }; struct quux_bas { void *p; }; enum quux_type {quux_foo, quux_bar, quux_bas}; struct […]

c编程语言中的宏评估

可能重复: “#define STR(a)#a”有什么作用? #include #define f(a,b) printf(“yes”) #define g(a) #a #define h(a) g(a) int main() { printf(“%s\n”,h(f(1,2))); printf(“%s\n”,g(f(1,2))); } 有人可以解释为什么两个printf()语句的输出都不同。

C宏是否隐式投射?

我搜索了SO,但没有找到这个具体问题的答案。 如果它已被回答,请原谅我。 如果您有以下内容: #define MACRO 40 您不将它分配给在循环中使用它的变量: for(int i = 0; i < MACRO; i++) {… 然后,perprocessor创建: for(int i = 0; i < 40; i++) {… 然后编译器会将它隐式地转换为int,因为比较是使用int i类型吗? 我看过这个问题#define变量的类型 ,以及Edgar Bonet的一些答案意味着编译器选择如何处理宏的顺序? 这个问题, C ++如何隐式地将参数转换为比较器,如<? ,也有人建议,但只描述了隐式转换如何与两种类型进行比较。 由于宏实际上没有类型,我不确定这是否适用。

在编译和链接C代码时,为什么在某些情况下不需要-lm?

我这里有一个示例文件: #include #include int main(){ printf(“%f\n”, log(10)); } 当我用gcc sample.c -oa编译它时它工作得很好。 我可以使用./a运行它,它会产生预期的输出2.302585 。 然而,当我的文件看起来像这样: #include #include int main(){ double a = 10; printf(“%f\n”, log(a)); } 它不能用gcc sample.c -oa编译。 相反,我必须使用gcc sample.c -oa -lm这样我才能显然告诉它“链接数学”…这就是我没有真正遵循的地方,为什么我不必在第一次链接数学例? 它究竟是什么意思必须“链接数学”? 自从我使用C编译器以来已经有一段时间了,所以如果这是一个糟糕的问题,请原谅我。

如何检查参数是否是C预处理器宏中的整数常量表达式?

我正在清理一个现有的C库,无耻地发布它。 预处理器宏NPOT用于在编译时计算给定积分常数表达式的下一个更大的2的幂。 宏通常用于直接初始化。 对于所有其他情况(例如,使用可变参数),存在具有相同function的内联函数。 但是,如果用户传递变量,则算法会扩展为大量的机器代码。 我的问题是: 我可以做些什么来防止用户向我的宏传递除了一个整数常量表达式之外的任何内容? #define NPOT(x) complex_algorithm(x) const int c=10; int main(void) { int i=5; foo = NPOT(5); // works, and does everything it should foo = NPOT(c); // works also, but blows up the code extremely foo = NPOT(i); // blows up the code also } 我已经尝试过的: 将宏定义为#define NPOT(x) complex_algorithm(x ## […]

C预处理器:stringize宏和身份宏

我想知道这段代码输出背后的原因。 我无法想出答案。 #define f(a,b) a##b #define g(a) #a #define h(a) g(a) void main() { printf(“%s %s”,h(f(1,2)),g(f(1,2))); } PS:输出为12 f(1,2) 。 我以为它是12 12或f(1,2) f(1,2) 。

在编译时获取源文件的基本名称

我正在使用GCC; __FILE__返回当前源文件的完整路径和名称: /path/to/file.cpp 。 有没有办法在编译时获取文件的名称file.cpp (没有它的路径)? 是否可以以便携方式执行此操作? 模板元编程可以应用于字符串吗? 我在错误记录宏中使用它。 我真的不希望我的源代码完整路径进入可执行文件。