如何正确处理模块 我正在使用Visual Studio 2012运行我的第一个C++项目 这是我的项目的体系结构: Source Files |main.cpp |stdafx.cpp |module.cpp Header files |stdafx.h |targetver.h |module.h
我总是在代码中尝试模块化,所以我通常在.h中标记变量和结构,然后在cpp文件中定义它们如何正确处理模块 我正在使用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
//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。这甚至可能是一个单独的静态或动态库
fopen
vs.CreateFile
——后者是Windows API,需要stdafx.h(或Windows.h),前者不需要。它只需要stdio.h
。