C 如何访问宏定义隐藏的全局变量?

C 如何访问宏定义隐藏的全局变量?,c,macros,C,Macros,是否可以访问已在(自引用)宏中使用的全局范围内的变量? 我使用的术语用于指代此类宏。 见 我的示例代码基于此处显示的示例代码 简单的例子: #include <stdio.h> int foo = 10; /*A variable at global scope. There may be a few of these.*/ #define foo (4 + foo) /*A self-referential macro. There may be a few of these.

是否可以访问已在(自引用)宏中使用的全局范围内的变量?
我使用的术语用于指代此类宏。

我的示例代码基于此处显示的示例代码

简单的例子:

#include <stdio.h>

int foo = 10; /*A variable at global scope. There may be a few of these.*/

#define foo (4 + foo) /*A self-referential macro. There may be a few of these.*/

int main()
{
    printf("foo = %d\n", foo); /*Prints 14. The value after the macro expansion */  

    /*Is there any way to access the global variable *foo* here?*/  

    return 0;
}
#包括
int-foo=10/*全局范围内的变量。其中可能有一些*/
#将foo(4+foo)/*定义为自引用宏。其中可能有一些*/
int main()
{
printf(“foo=%d\n”,foo);/*打印14。宏展开后的值*/
/*有没有办法在这里访问全局变量*foo*
返回0;
}
是否可以访问在自引用宏中使用的全局范围内的变量

不,它不是。FWIW,将全局变量重新定义为宏是非常难看和低级趣味的,并且使代码无法读取。不要那样做

阅读更多关于C语言中各种语言的信息(稍后,也请参考C11标准)。在实际解析之前发生(概念上)

在实践中,不要
#定义foo
,而要例如
#定义foo#u MAC
,并适当地使用
foo#MAC
foo
(正如Eric Postdischil所说,您可以改为使用
#unde
,但这会降低代码的可读性)

顺便说一句,您可以获得预处理的表单(作为文本文件)。有,如

然后用寻呼机或编辑器查看文件
yourfoocode.i

也请阅读

特别是对于GCC,您还可以在全局变量声明中使用(例如,
intotherfoo asm(“foo”);
)来声明位于同一位置的另一个变量。但这会使读者感到困惑,并可能会打乱编译器的优化过程(例如,
&foo!=&otherfoo
可能被优化为true,但为false),因此您不想这样做


请注意,C编程需要很多好的约定和样式才能有可读的代码,因此在实践中,您所要求的永远不会发生。如果需要,您需要重写代码(仅出于可读性原因)。

是的,您可以使用
#undefoo
删除宏定义。

代码对可读性和可维护性造成负担。
我希望你只是问这个,因为这是一些遗留代码,你必须处理,我觉得你

我想,最接近访问全局变量的方法是,对显示的代码进行最少的更改,并且不添加其他代码文件

#include <stdio.h>

int foo = 10; /*A variable at global scope. There may be a few of these.*/
int* backdoorfoo = &foo;

#define foo (4 + foo) /*A self-referential macro. There may be a few of these.*/

int main()
{
    printf("foo = %d\n", foo); /*Prints 14. The value after the macro expansion */  

    printf("foo = %d\n", *backdoorfoo); /*Prints 10, via dereferencing the differently named pointer. */  

    return 0;
}
第二,c:

#include <stdio.h>

extern int foo;

void printfoo(void)
{
        printf("foo = %d\n", foo); /*Prints 14. The value after the macro expansion */
}
#包括
外间国际办事处;
void printfoo(void)
{
printf(“foo=%d\n”,foo);/*打印14.宏展开后的值*/
}

您的
printf
访问
foo
-它读取
foo
的值,这是一种访问。您的意思是问是否可以设置该值?或者不通过宏读取值?@EricPostpischil:printf中的foo值是宏的值,而不是全局变量。此外,宏不是自引用的。当宏的标识符出现在替换文本中时,它不会被替换,因此它不是对宏的引用。请参见完全从代码中删除宏
#define
。像这样模糊的代码需要重写。大多数编码指南要求宏用大写字母snake_case命名,因此
#define FOO
#define FOO_MAC
将更好地感谢详细答案和实用建议。是的,在printf之后执行此操作将允许再次访问全局变量。感谢您给出的令人同情的答案。对这个问题的否决票令人费解。我之所以否决这个问题,是因为它缺乏动机(以及之前的研究,例如阅读C参考文档)。@BasileStrynkevich:我在问题中提供的示例代码取自您引用的C参考文档。如果没有事先的研究,这是可能的吗?但是你忘了引用它。我试图在这里进行调解,改进这个问题,而不是偏袒任何一方。需要将所有信息添加到问题本身,而不是添加到评论中。(我这么做是为了你,假设你很欣赏。)它避免了被读者错过。立即这样做还可以防止读者看不到它们。(我之所以提到这一点,是因为我认为至少有一张反对票比相应的评论早。)
#include <stdio.h>

int foo = 10; /*A variable at global scope. There may be a few of these.*/

#define foo (4 + foo) /*A self-referential macro. There may be a few of these.*/

void printfoo(void); /* only needed for demo */
int main()
{
    printf("foo = %d\n", foo); /*Prints 14. The value after the macro expansion */

    printfoo(); /* Only needed for demo. Prints 10, the value of global foo variable.  */

    return 0;
}
#include <stdio.h>

extern int foo;

void printfoo(void)
{
        printf("foo = %d\n", foo); /*Prints 14. The value after the macro expansion */
}