如何正确处理模块 我正在使用Visual Studio 2012运行我的第一个C++项目 这是我的项目的体系结构: Source Files |main.cpp |stdafx.cpp |module.cpp Header files |stdafx.h |targetver.h |module.h

如何正确处理模块 我正在使用Visual Studio 2012运行我的第一个C++项目 这是我的项目的体系结构: Source Files |main.cpp |stdafx.cpp |module.cpp Header files |stdafx.h |targetver.h |module.h,c++,c,visual-studio,visual-studio-2012,C++,C,Visual Studio,Visual Studio 2012,我总是在代码中尝试模块化,所以我通常在.h中标记变量和结构,然后在cpp文件中定义它们 //module.h #ifndef MODULE_H #define MODULE_H int a; typedef struct { int a; int b; }tmastruct; typedef enum {LUNDI, MARDI}eMaEnum; extern void fct(void); #endif module.cpp: //module.cpp #include "std

我总是在代码中尝试模块化,所以我通常在.h中标记变量和结构,然后在cpp文件中定义它们

//module.h
#ifndef MODULE_H
#define MODULE_H

int a;
typedef struct 
{
 int a;
 int b;
}tmastruct;
typedef enum {LUNDI, MARDI}eMaEnum;
extern void fct(void);

#endif 
module.cpp:

//module.cpp
#include "stdafx.h"
#include "a.h"

void fct()
{
  printf ("Hello World \n");
}
但事实上我不知道为什么我会

error LNK2005: "int a" (?a@@3IA) main.obj  

我知道通过声明一个AS Extn int A,问题将得到解决,但我想知道为什么第一个声明在C项目上工作,而不是在C++项目

中。 我还有一个关于如何正确使用stdAfx.h的问题,在检查了一些帖子后,我制定了以下规则:

1) h应该包含很少修改的头文件(这意味着它不应该包含您自己模块的头文件)

2) 在包含stdafx.h之后,stdafx.h应仅包含在.cpp文件中。您可以包含自己的模块头

你认为这个规则是正确的吗?你如何处理你的模块?< /P> < P> <强> As,C和C++是非常不同的语言<强>,但我补充说,MSVC(和GCC)是超越它们自己的独特事物。

<> P>在头中定义数据元素,如“代码> int A <代码>,因为如果头包含多于一次,则会导致多个定义,这是C中未定义的行为,并且在C++中是不正确的(没有诊断要求)。MSVC可能是一个编译器,它接受C++中的多个常见的非冲突定义作为扩展,但显然,它不是异常的,它在C++中诊断和不接受它。 在上看到这个答案,我认为MSVC不应该接受这个程序,即使是在C语言中

注意:这里没有足够的细节可以复制以确定

对于您的问题,我有以下最佳建议:

  • 将数据项声明放在模块头中,始终使用extern
  • 将函数声明放在模块头中,extern是超级函数,因此必须保持一致,但无论如何都是相同的
  • 不要在stdafx.h中放入任何东西,除了GUI自动执行或需要的内容
  • 在所有使用stdafx.h的.cpp文件中,stdafx.h必须位于第一位,然后是其他头文件
  • 将可移植的C或C++代码与MSVC特定的代码分开,在这些文件中不包括STDAFX.H。这甚至可能是一个单独的静态或动态库

因为在一个头文件中放置了<代码> <代码>的定义,它在每个<代码> .CPP文件中都包含了。好的,为什么在同一个定义中,C项目中没有问题,当我运行C++项目时,我有问题感谢安德斯,你的答案帮助我不去理解我通常在代码中使用的一些坏习惯,我只是不知道我知道的第五点(正如你在4点提到的),包括STDAFX.H在所有CPP/C文件中都是强制性的。不,当然,对于非Windows C或C++代码,不需要STDAFX.H。而且它不应该包含在这样的代码中。但是,如果启用了预编译头或者正在使用MFC,则main.exe项目中的所有.cpp文件都需要它。因此,你可以做的一件事就是移动,通常是代码的大部分,可移植的ANSI C或C++到静态库或DLL项目。请记住,MSVC有对标准C的扩展,但如果您使用它,也可以编写标准C代码。而且stdafx.h根本不是标准的;把你所有的.h文件都放在一个普通的文件中,这甚至不是一个好的做法。当我说非windows时,我仍然是指运行在MSVC编译的windows上的代码。例如,
fopen
vs.
CreateFile
——后者是Windows API,需要stdafx.h(或Windows.h),前者不需要。它只需要
stdio.h