无法理解函数中宏定义的范围

时间:2014-09-23 17:59:11

标签: c macros

我在函数中定义了宏。我在main函数中使用了这个宏,它工作正常。

还有全局范围

#include <stdio.h>
void f()
{
#define SQUARE no*no
}

void main()
{
    int no;
    printf("Enter no");
    scanf("%d",&no);
    printf("Square of no = %d",SQUARE);
}

3 个答案:

答案 0 :(得分:3)

看起来他们有全局范围文件范围(这就是你说全局范围时的意思)但宏没有范围,因为他们在语义分析之前的预处理期间被替换。如果我们转到draft C99 standard,则会在6.2.1 标识符范围中说明以下内容:

  

[...]此处不再考虑宏名称和宏参数,   因为在程序翻译的语义阶段之前   源文件中出现的宏名称被替换为   预处理构成其宏定义的令牌序列。

答案 1 :(得分:0)

什么阻止你自己尝试?

答案是肯定的。它具有全局范围

答案 2 :(得分:0)

在C语言中,宏在翻译的早期阶段进行处理。在那个阶段,范围的语言级概念尚不适用。处理宏时不考虑任何范围。

请注意,C语言没有&#34;全局范围&#34;等范围。 C语言仅定义文件范围,功能范围,范围和函数原型范围。就是这样。没有&#34;全球&#34;范围。

处理范围(6.2.1)的语言规范部分明确说明

  

此处不再考虑宏名称和宏参数,   因为在程序翻译的语义阶段之前   源文件中出现的宏名称被替换为   预处理构成其宏定义的令牌序列。

这意味着范围的概念不适用于宏。