有没有一种方法可以通过检查编译的对象或在.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)
这就要求我仍然知道什么AAA
和BBB
是。
编译:
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
转成1
和10
,分别。
也许更清楚的例子是
#define AAA 1
#define CCC AAA
#define AAA "hello"
size_t x = sizeof CCC;
此代码将扩展为"hello"
,而不是1
。CCC
始终具有的值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] 删除。
我来说两句