Tag: c preprocessor

C中的宏和函数有什么区别?

C中的宏和函数有什么区别? 请告诉我一个可以使用宏和function的应用程序?

C #define宏

这就是我所拥有的,我想知道它是如何工作的以及它实际上做了什么。 #define NUM 5 #define FTIMES(x)(x*5) int main(void) { int j = 1; printf(“%d %d\n”, FTIMES(j+5), FTIMES((j+5))); } 它产生两个整数:26和30。 它是如何做到的?

制作C标识符和字符串?

假设您要生成标识符和字符串的匹配列表 enum { NAME_ONE, NAME_TWO, NAME_THREE }; myFunction(NAME_ONE, “NAME_ONE”); myFunction(NAME_TWO, “NAME_TWO”); myFunction(NAME_THREE, “NAME_THREE”); ..没有重复自己,没有自动生成代码,使用C / C ++宏 初步猜测: 您可以添加包含的#include文件 myDefine(NAME_ONE) myDefine(NAME_TWO) myDefine(NAME_THREE) 然后使用它两次: #define myDefine(a) a, enum { #include “definitions” } #undef myDefine #define myDefine(a) myFunc(a, “a”); #include “definitions” #undef myDefine 但#define不允许你把参数放在一个字符串中?

pragma代码部分和数据部分有什么用?

如果我在我的c源代码文件中使用以下两行,那么数据段和文本段究竟会发生什么? #pragma CODE_SECTION(func1, “Sec1”) #pragma DATA_SECTION(globalvar1, “Sec2”)

C预处理器通过串联和字符串化生成宏

我有一组目标宏,我想根据选择的宏生成别名,如下所示: 选择宏: #define I2C_MODULE 1 别名宏(概念forms): #define I2C_MODULE_BASE I2C_BASE #define I2C_MODULE_NVIC INT_I2C 目标宏(来自我控制的外部文件): #define INT_I2C0 24 #define INT_I2C1 53 … #define I2C0_BASE 0x40020000 #define I2C1_BASE 0x40021000 … 我希望让预处理器根据选择的宏I2C_MODULE生成别名宏I2C_MODULE_BASE和I2C_MODULE_NVIC ,但是经过多次读取Q1 , P1和许多其他参考我失去了跟踪,我最终硬编码了它们的值。 下面我展示了我当前的工作定义,然后是我上次生成宏的失败尝试: 什么有效: #define I2C_MODULE 1 #define I2C_MODULE_BASE I2C1_BASE #define I2C_MODULE_NVIC INT_I2C1 什么没有奏效: #define I2C_MODULE 1 #define STR_HELPER(x) #x #define STR(x) STR_HELPER(x) /* Attempt 1 […]

使用编译器定义的宏连接

这应该很简单,但我很难弄明白。 我有PROJECT_NAME作为编译器( g++ )- -D define,我想将它与其他一些文本连接起来以形成命名空间名称。 我目前的做法是这样的: #define VERSION_NAMESPACE PROJECT_NAME ## Versioning 对于我当前的项目,我希望VERSION_NAMESPACE是Syren_DLLVersioning 。 相反,我得到一个编译器错误: error: ‘PROJECT_NAMEVersioning’ has not been declared 但根据g++调用, PROJECT_NAME正在被正确定义: ccache g++ … -DPROJECT_NAME=Syren_DLL … 为什么在连接发生之前PROJECT_NAME没有被替换?

在##连接之前评估预处理程序令牌

我想在它与其他东西连接之前评估一个令牌。 “问题”是标准将行为指定为 在重新检查替换列表以更换更多宏名称之前,删除替换列表中的##预处理标记的每个实例(不是来自参数),并将前面的预处理标记与以下预处理标记连接起来。 因此在下面的例子中, #include struct xy { int x; int y; }; struct something { char * s; void *ptr; int size; struct xy *xys; }; #define ARRAY_SIZE(a) ( sizeof(a) / sizeof((a)[0]) ) #define DECLARE_XY_BEGIN(prefix) \ struct xy prefix ## _xy_table[] = { #define XY(x, y) {x, y}, #define DECLARE_XY_END(prefix) \ {0, 0} \ […]

限制#define标签的范围

限制#define标签范围并避免不必要的令牌冲突的正确策略是什么? 在以下配置中: MAIN.C # include “Utility_1.h” # include “Utility_2.h” # include “Utility_3.h” VOID Main() { … } Utility_1.h # define ZERO “Zero” # define ONE “One” BOOL Utility_1(); // Uses- ZERO:”Zero” & ONE:”One” Utility_2.h # define ZERO ‘0’ # define ONE ‘1’ BOOL Utility_2(); // Uses- ZERO:’0′ & ONE:’1′ Utility_3.h const UINT ZERO = 0; […]

检查是否用C预处理器声明了函数?

是否可以告诉C预处理器检查是否声明了函数(不是宏)? 我尝试了以下方法,但它似乎不起作用: #include int main(void) { #if defined(printf) printf(“You support printf!\n”); #else puts(“Either you don’t support printf, or this test doesn’t work.”); #endif return 0; }

#Define VS Variable

我无法理解有什么区别: #define WIDTH 10 和 int width = 10; 使用第一个或第二个有什么好处?