2012-11-01 81 views
2

面试问题很常问。但是,我不清楚我在不同网站上找到的解释。因为,当我试图执行此代码时,它显示_AX未声明的错误。psuedo全局变量c

main() 
    { 
    int i; 
    i = abc(); 
    printf("%d",i); 
    } 
    abc() 
    { 
    _AX = 1000; 
    } 

人说_AX伪全局变量,这就是为什么它显示输出。

* 注: - 它显示错误_AX未申报的,但是当我声明的变量,那么就说明一些垃圾值*

+1

请注意,任何以下划线后跟大写字母或两个下划线开头的标识符都被认为是由编译器/实现保留的。由于'_AX'符合该模式,因此您马上知道这是某种特定于编译器的功能。 –

+0

我认为它是C的一些dos扩展的一部分。不要认为它是C标准的一部分。你正在使用哪种编译器? – CCoder

+0

visual studio编译器 – Ravi

回答

10

这频繁出现?这完全是无稽之谈。推测_AX是一些特定于编译器的符号,用于访问“ax”寄存器,该寄存器在x86上用于返回值。但是没有理由相信寄存器中的值不应该在赋值和函数返回之间被破坏。这个程序调用未定义的行为。如果有人提供你的工作,希望你知道这种无效的做法,运行。快速。他们不胜任。

+0

'_AX'是一个Borland C扩展,所以除非你使用Borland编译器,否则它将不会被定义。看到http://stackoverflow.com/questions/10891566/pseudo-registers-in-msvc – shf301

+3

更多的红旗:他们使用老的不好的做法,如隐式函数声明和隐式'int'。 –

+0

请注意,这种类型的扩展 - 直接访问寄存器并由编译器保证寄存器将它们的值保存在C语句之间 - 基本上阻止了编译器进行任何**优化。编译器将C视为汇编语言的最小结构包装器,这意味着代码生成将非常糟糕。 –