2016-02-10 41 views
0

我正在使用C遗留代码。在代码中,使用宏:C:宏的打印值

static int _main(A_MACRO *input_obj) 
{ 
.... 

我不确定A_MACRO声明input_obj的数据类型是什么。我如何将这些信息打印到屏幕上?

我试图做这样的:

static int _main(A_MACRO *input_obj) 
{ 
sprintf("%s is the macro", A_MACRO); 
.... 

但造成此错误消息:

error: expected primary-expression before ‘)’ token 
+0

“我使用C遗留代码工作” - 那么,为什么添加的标签不同语言?并提供[mcve]。 – Olaf

+0

你使用什么编译器? 'gcc -E'发出预处理的代码。但是''grep'' #define A_MACRO'的所有出现可能更容易.. –

+1

您需要在代码库中查找定义此宏的位置。运行'grep“#define。* A_MACRO”* .c * .h'来找到它。 – dbush

回答

1

您可以创建一个“stringize”宏观该定义转换为像一个字符串所以:

#define STRINGIZE_(x) #x 
#define STRINGIZE(x) STRINGIZE_(x) 

然后,您只需“调用”它的宏名称:

printf("A_MACRO is defined as %s\n", STRINGIZE(A_MACRO)); 

或者,这取决于你使用的编译器,它可能显示宏定义的选项。例如,gcc可以使用-dM选项:

gcc -dM file.c | grep A_MACRO 
+1

您需要双层实现'STRINGIZE(x)'来处理自身为宏的参数。你现在所拥有的仅仅是打印“A_MACRO”字符串,而不是“A_MACRO”宏的实际“值”。首先,'#define STRINGIZE_(x)#x',然后'#define STRINGIZE(x)STRINGIZE_(x)'。 – AnT

+0

@AnT两级执行不起作用它正在打印“A_MACRO”我认为唯一的方法是'-dM'标志。 – nikartix

+0

@Nick:你确定你转载了它吗? – AnT