从C语言中的宏函数返回一个字符串,可以通过以下方法实现: 使用字符串字面量: 代码语言:c 复制 #include<stdio.h> #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) #define CONCAT(a, b) a##b #define CONCAT_EXPAND(a, b) CONCAT(a, b) #def
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #define MACRO_ADD(a, b) \ do {\ sum = add(a, b); \ }while(0) static int32_t add(int32_t a, int32_t b) { return a + b; } int main(int argc, char *argv[]) { int32_t sum = 0;...
#include "string.h" #include "stdlib.h" #define DEBUG #ifdef DEBUG #define PRINT_DEBUG(fmt, ...) printf(fmt, ##__VA_ARGS__) #else #define PRINT_DEBUG(fmt, ...) #endif int main() { int v = 10; char value[] = "达帮主"; PRINT_DEBUG("%s\n",value); system("pause"); r...
#defineNAME_OF_MACRO value 比如,以下代码定义了一个名为BUFFER_SIZE的宏,指代1024这个数字。 #defineBUFFER_SIZE1024 使用时, foo = (char *) malloc (BUFFER_SIZE); 使用预处理器编译: $ gcc -E test.c 编译结果: foo = (char *) malloc (1024); 多行 宏的定义是跟随#define在一同一行内的,但可...
我稍微讲解下宏的一些语法问题(说语法问题似乎不妥,macro只与preprocessor有关,跟语义分析又无关): 1. 宏可以像函数一样被定义,例如: #define min(x,y) (x 但是在实际使用时,只有当写上min(),必须加括号,min才会被作为宏展开,否则不做任何处理。
如果使用macro机制的话,可以通过预编译和macro机制一次性处理上述的问题。 例如:在文件msgdef.h中 1 #ifndef _MSGDEF_H_ 2 #define_MSGDEF_H_ 3 #undefUSEMACRO 4 #ifdefined(INCLUDE_AS_ENUM)//判断预编译宏的设置情况,判断是转换成enum还是string ...
C语言宏(macro)小技巧 目录 字符串化运算符(stringizing operator) 记号粘贴运算符(token-pasting operator) 二选一选择器宏(mux) 字符串化运算符(stringizing operator)# 运算符 # 在宏中会将实参直接转化为字符串literal,也就是字符串常量,举个简单的例子: #define arg2str(p) #p puts(arg2str(666));...
#define MUL(x, y) ((x) * (y)) 这样的话,上述例子就被展开成为 int ret = ((2 + 3) * (4)); 从而保证了运算的顺序与期望的顺序一致。 符号#和## #符号把一个宏参数直接转换为字符串,例如 #define STRING(x) #x const char * str = STRING(test); ...
每个#define行(即逻辑行)由三部分组成:第一部分是指令 #define 自身,“#”表示这是一条预处理命令,“define”为宏命令。第二部分为宏(macro),一般为缩略语,其名称(宏名)一般大写,而且不能有空格,遵循C变量命令规则。第三部分“替换文本”可以是任意常数、表达式、字符串等。在预处理工作过程中,代码中所有出现...
define TO_STRING1( x ) #x TO_STRING首先会将x全部展开(如果x也是一个宏的话),然后再传给TO_STRING1转换为字符串,现在你可以这样: const char *str = TO_STRING( PARAM( ADDPARAM( 1 ) ) );去一探PARAM展开后的样子。 一个很重要的补充:就像我在第一点说的那样,如果一个像函数的宏在使用时没有出...