Questions tagged «stringification»


4
定义宏中的语法
有什么方法可以将pragma语句与其他语句一起嵌入宏中? 我正在尝试实现以下目标: #define DEFINE_DELETE_OBJECT(type) \ void delete_ ## type_(int handle); \ void delete_ ## type(int handle); \ #pragma weak delete_ ## type_ = delete_ ## type 如果存在的话,我可以使用增强解决方案(节省波动)。

3
使用C预处理器将int连接到字符串
我试图弄清楚如何使用C预处理器将#define'd int串联为#define'd字符串。我的编译器是CentOS 5上的GCC 4.1。该解决方案也应适用于MinGW。 我想在字符串上附加一个版本号,但是唯一可以使它起作用的方法是将版本号的副本定义为字符串。 我能找到的最接近的东西是引用宏参数的方法,但不适用于#defines 这是行不通的。 #define MAJOR_VER 2 #define MINOR_VER 6 #define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER 它不没有工作,#小号或者是因为值为数字,它会扩大到"/home/user/.myapp" 2 6,这是无效的Ç。 确实可以,但是我不喜欢定义版本的副本,因为我确实也需要它们作为数字。 #define MAJOR_VER 2 #define MINOR_VER 6 #define MAJOR_VER_STR "2" #define MINOR_VER_STR "6" #define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING

13
##预处理程序运算符和陷阱需要考虑哪些应用?
正如我之前的许多问题中提到的那样,我正在研究K&R,目前正在使用预处理器。##预处理程序运算符是更有趣的事情之一,这是我以前学习C的任何尝试中从未知道的事情。根据K&R: 预处理程序运算符## 提供了一种在宏扩展过程中连接实际参数的方法。如果替换文本中##的参数与a相邻,则该参数将被实际参数替换, ##并删除空格和周围的空白,然后重新扫描结果。例如,宏paste 将其两个参数串联在一起: #define paste(front, back) front ## back 因此paste(name, 1)创建令牌 name1。 有人将如何以及为什么在现实世界中使用它?使用它的实际例子是什么,是否有需要考虑的地方?

2
确切地说,双字符串技巧是如何工作的?
至少某些C预处理程序使您可以将宏的值而不是其名称进行字符串化,方法是将其通过一个类似于函数的宏传递给另一个对其进行字符串化的宏: #define STR1(x) #x #define STR2(x) STR1(x) #define THE_ANSWER 42 #define THE_ANSWER_STR STR2(THE_ANSWER) /* "42" */ 这里的示例用例。 这确实有效,至少在GCC和Clang(都带有-std=c99)中有效,但是我不确定它在C标准术语下如何工作。 C99是否可以保证这种行为? 如果是这样,C99如何保证? 如果不是,那么行为在什么时候从C定义变为GCC定义?

6
将预处理器令牌转换为字符串
我正在寻找一种将预处理器令牌转换为字符串的方法。 具体来说,我在某处: #define MAX_LEN 16 我想用它来防止缓冲区溢出: char val[MAX_LEN+1]; // room for \0 sscanf(buf, "%"MAX_LEN"s", val); 我愿意采用其他方式来完成同一件事,但仅限于标准库。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.