确定C宏的扩展

有没有一种方法可以通过检查编译的对象或在.c或.h文件中运行某种形式的gcc -E来确定扩展的C宏的“最终值”?

测试

#define AAA 1
#define BBB 10
#define CCC (AAA+BBB)

测试

#include <stdio.h>
#include "test.h"

int main(){
   printf("%d\n", CCC);
   return 0;
}

因此可以通过某种方式获取扩展值:

#define CCC 11

要么

#define CCC (1+10)

如果用

gcc -dM -E test.c | grep CCC 

要么

gcc -dD -E test.c | grep CCC

输出

#define CCC (AAA+BBB)

这就要求我仍然知道什么AAABBB是。

编译:

gcc -E test.c

给出(跳过样板):

# 4 "test.c"
int main(){
printf("%d\n", (1+10));
return 0;
}   

在扩展后,CCC我现在已经失去了映射到的功能CCC

编辑:尚不清楚,我想以某种方式确定CCC是什么(11或1 + 10(如gcc -E示例显示它仅插入(1 + 10)而不是11)),最好不更改代码本身,在MRE中使用Printf是一个坏主意,我真正想到的是这样的代码:

struct my_struct {
    int my_array[CCC]
    ... other stuff ...
}

问题是my_array有多大,所以我可以用另一种语言(通过ctypes通过python)制作一个结构,并知道我需要多少空间。我知道我可以使用pahole的结构,但希望仅使用gcc和更一般的情况(例如,不在结构中的全局数组)执行此操作。

甲肾上腺素

预处理器决不会创建

#define CCC (1+10)

的扩展CCC总是(AAA+BBB); 它只是宏扩展的结果是重新扫描多个宏扩大,在这一点AAA,并BBB转成110,分别。

也许更清楚的例子是

#define AAA 1
#define CCC AAA
#define AAA "hello"

size_t x = sizeof CCC;

此代码将扩展为"hello",而不是1CCC始终具有的值AAA; 只是到了size_t x = sizeof CCC;处理时间AAA它本身就会变成"hello"

此示例还演示了可以重新定义宏,因此甚至可能没有一个单独的答案“?的值是CCC什么”。

这就是为什么没有简单的编译器调用或切换的原因。您想要的东西根本不存在。

就是说,如果您可以使用自定义代码,则可以运行例如

#define AAA 1
#define BBB 10
#define CCC (AAA+BBB)
CCC

通过gcc -P -E,结果将是公正的(1+10)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章