【问题标题】:ABOUT HEADER FILE CREATION ERROR IN C++关于 C++ 中的头文件创建错误
【发布时间】:2014-02-12 07:12:42
【问题描述】:

我正在为 .cpp 文件创建头文件,其中仅包含函数的声明或原型

这是我写的三个程序 1.header.h 文件//我在其中声明了函数 add(,) 和 sub(,)

 #ifndef HEADER_H
 #define HEADER_H
 #pragma once
 int s;
 int add(int a,int b);
 int sub(int a,int b);
 #endif

2.header.cpp,其中我定义了函数 add(,) 和 sub(,)

 #include<iostream>
 #include "header.h"
 using namespace std;


int add(int a,int b){
s=10;   
int c=a+b+s;
return c;
}

 int sub(int a,int b){
 int c=a-b;
 return c;
 }    

3.example.cpp

     #include<iostream>
     #include"header.h"
     using namespace std;
      void main(){

    int a=10,b=20;

    int c=add(a,b);
    int d=sub(c,a);

    cout<<"c"<<c;
    cout<<"d"<<d;

    //cout<<s;
    getchar();
      }

在这里,我在 header.h 中声明了变量 's' 并在 header.cpp 文件中定义,这是在 example.cpp 文件输出中作为变量 c 的补充。

显示错误 header.obj : 错误 LNK2005: "int s" (?s@@3HA) 已在 example.obj 中定义 Projects\header\Debug\header.exe:致命错误 LNK1169:找到一个或多个多重定义符号 请帮我解决这个错误,我为此工作了很长时间......提前谢谢

【问题讨论】:

  • 如果你使用 include guard #define,我认为将#pragma once 放入其中是没有意义的......
  • 但我在互联网上读到#pragma 的使用将用于优化代码执行,我补充说,你的意思是说我只能写,#ifndef #pragma ..endif,对吗?
  • 不,#ifndef#define 就像你拥有它们一样。 #pragma once 是一个非标准化的替代,可能会减少某些编译器的编译时间。它不会以任何方式影响代码执行。你可能应该把它放在include guards 之外,或者根本不使用它。

标签: c++ windows visual-studio-2010


【解决方案1】:

你得到了错误,因为 .h 中的这一行已经是一个定义

int s;

你需要在标题中有这个:

extern int s;

然后在一个 .cpp 文件中,通常是一个与 .h 文件具有相同基本文件名的文件,您需要定义:

int s;

相关:你不需要 extern 关键字和函数声明,因为它们只是声明,告诉编译器这样的函数存在于某个地方,你可以随意多次这样做。但是如果你把一个全局(非static,非inline)函数定义(用{}函数体而不是;)放到一个.h文件中,你会得到关于多个定义的类似链接器错误。

【讨论】:

  • @Santhosh 酷。在 SO,一旦您得到满意的答案,您将最喜欢的答案标记为已接受(答案左上角的勾号)。这将问题标记为“已解决”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
相关资源
最近更新 更多