【发布时间】: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