【问题标题】:different initializ and sign pointer value in global and function全局和函数中不同的初始化和符号指针值
【发布时间】:2014-01-26 10:34:46
【问题描述】:

我知道我会在这个问题上得到很多降级,但我仍然编写以下测试代码:

int *gPtr;
//I know I can NOT write below code line, but I need know WHY
gPtr = NULL;//or some other value which I want to init it
//int *gPtr = NULL; //this line should be OK

int main (void)
{
    int *ptr;
    ptr = NULL;
    return 0;
}

编译时全局*gPtr会输出错误:

ptr.c:4:1: warning: data definition has no type or storage class [enabled by default]
ptr.c:4:1: error: conflicting types for ‘gPtr’
ptr.c:3:6: note: previous declaration of ‘gPtr’ was here
ptr.c:4:8: warning: initialization makes integer from pointer without a cast [enabled by default]

但是,在函数中,我做了相同的代码,但没有编译错误/警告,我想知道:

  • 在全局和函数中对值进行签名有什么区别。
  • 为什么编译器不允许我在全局区域中对值进行签名。
  • int a = 0;int a; a=0;//no other code between these two sentences 有什么不同

请根据编译器的观点给我以上三个问题的建议(或者你认为在其他一些观点中应该有其他解释,比如编码标准?)

【问题讨论】:

  • int *gPtr = NULL; 因为它是静态的,所以只需 int *gPtr; 就足够了。你不能;在这样的全局空间中有程序代码stmts。你可以在一个函数中。 Fwiw,我的编译器吐出一个完全不同的错误(“所有声明都需要类型说明符”)。

标签: c gcc compiler-construction


【解决方案1】:

你可以定义一个带有初始值的全局变量:

int *gPtr = NULL;

但是你不能在函数范围之外进行赋值。 编译器(嗯,至少我的 clang 编译器)实际上会解释

gPtr = NULL;

在全局范围内

int gPtr = NULL;

这会导致类似的警告和冲突的类型错误:

警告:缺少类型说明符,默认为 'int' [-Wimplicit-int] gPtr = NULL; ^~~~ 错误:使用不同类型重新定义“gPtr”:“int”与“int *” 注意:之前的定义在这里 int *gPtr;

没有显式初始值的全局变量会自动初始化 为零,因此在你的情况下

int *gPtr;

就足够了(正如@WhozCraig 上面已经评论的那样)。

【讨论】:

  • +1 你在运行什么版本的clang。我的 3.3 只是抱怨缺少类型说明符。只是好奇。
  • @WhozCraig:Xcode 5.0.2 自带的:Apple LLVM version 5.0 (clang-500.2.79)(基于 LLVM 3.3svn)
  • 你的意思是即使我在全球写*gPtr = NULL实际上和我写int *gPrt = NULL一样吗?
  • @HowChen:我的意思是int *gPrt = NULLint *gPrt 是一样的全局变量。
【解决方案2】:

这编译得很好:

#include <stdio.h>
/* int *gPtr; */
/* gPtr = NULL; */
int *gPtr = NULL;

int main (void)
{
    int *ptr;
    ptr = NULL;
    return 0;
}

我怀疑您遇到了两个问题之一。首先,您不能声明gptr,然后将其分配为NULL,然后然后执行int *gptr = NULL(将前两个合并);因此我注释掉了前两个。你需要一个或另一个。其次,您的行 int *gPtr = NULL; 缺少分号。

【讨论】:

  • 我想他知道这一点,他只是想知道为什么前两行不做同样的事情。
  • 很难说,但他似乎在抱怨编译错误。
  • 啊,我明白你在说什么了。是的,赞成另一个答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
相关资源
最近更新 更多