使用extern变量时的问题

时间:2011-06-23 10:19:28

标签: c++

//FILE 1
char *ptr="Sample";

void SomeFunction() {
  cout<<ptr<<endl;
}

//FILE 2

void SomeFunction();
int main() 
{
  extern char ptr[];
  SomeFunction();
  cout<<ptr<<endl;
}
主函数中的

ptr是打印一些垃圾值。请让我知道原因。

5 个答案:

答案 0 :(得分:3)

ptr被声明为文件1中的指针,并作为文件2中的数组。指针和数组不是一回事,即使它们的行为有时相似。

确保您的extern声明与其定义中指定的变量类型相匹配。

答案 1 :(得分:3)

  1. 从不声明本地外部变量,所有外部变量都是定义全局的,声明它们localy会引起混淆
  2. 使用匹配类型extern char *ptr;
  3. 字符串文字为const char*而不是char *

答案 2 :(得分:1)

如果您编写了与file1.cpp对应的头文件,则可能会遇到char*char[]的问题。

// file1.h

extern char* ptr;        // Corresponds to your implementation

// Better:
extern const char * ptr; // Consistent with assignment to a string literal

// Alternative:
extern char ptr[];       // Would require changing implementation in file1 to
                         // char ptr[] = "Hello world";

你的file2.cpp做得非常糟糕:它正在声明extern指针本身。永远不要那样做。相反,file2.cpp应该#include这个新的头文件,应该是file1.cpp 。通过这种方式,您可以找到不一致的内容,例如您遇到的内容。

答案 3 :(得分:0)

char *char []不是一回事。一个是指针,另一个是数组。请参阅C FAQ中的this page

在File1中更改您的定义,或在File2中更改您的声明。

答案 4 :(得分:0)

我尽量不要忘记一年前学到的一切,所以这就是它应该如何:

请看Let_Me_Be的答案以获得好评。

您的主要功能是打印垃圾,因为您声明的变量与第一个文件中的变量不同。

$ cat print.cpp  ;echo ---; cat print2.cpp 
#include <stdio.h>
#include <cstdlib>
#include <iostream> 
using namespace std;
const char *ptr = "Hello";
void sayLol(){
        cout<<ptr<<endl;
}
---
#include <stdio.h>
#include <cstdlib>
#include <iostream> 
using namespace std;
void sayLol();
int main(void){
        extern char *ptr;
        sayLol();
        cout<<ptr<<endl;
}