下面我有一个代码可以在我的大多数简单程序中运行.. 我想知道它是好还是坏......以及缺点/专业人士。
。
win32头文件:
win32.h
// example of a not realated code to exaplin the question
// this header have all win32 includes like win/proces/stdarg/string ... etc
#include <windows.h>
#include <process.h>
#include <stdarg.h>
主头文件: inc.h
//this file includes the following
//top : the windows header file
#include "win32.h" // include the win32.h header file
//the extern define which is the question
//the first include cause the INCS to be defined
//any include afterwards causes the DD to go from 'nothing' into 'extern'
#ifndef INCS
#define INCS
#define DD
#else
#define DD extern
#endif
// unrealted code to be more informative
//middle area of the file have the variables /defines or w/e
#ifndef VARS
#define titlen L"my program"
#endif
DD wchar_t gtitle[512];
DD wchar_t gclass[512];
DD wchar_t gdir[32767];
//last area of the file
// this bottom area have the project's files' all included all headers and code
#include "resources.h"
#include "commonfunctions.cpp"
然后所有文件都有这样的东西 commonfunctions.cpp
//a code just to be more informative and it's not realted to the question
#include "inc.h" // no need for includings ?
DD inline bool icmp( const char *String1, const char *String2 )
{
if ( _stricmp( String1, String2 ) == 0 ) { return true; }
return false;
}
DD inline bool scmp( const char *String1, const char *String2 )
{
if ( strcmp( String1, String2 ) == 0 ) { return true; }
return false;
}
所有全局变量前面都有 DD ,并且所有函数/ subs也都有 DD ,这将导致函数在包含时被定义为所有文件中的extern第二次
这有什么不好的一面吗? 。我提出了这个想法,在小程序中根本没有问题。但在我将它应用于大型项目之前,它会有问题吗? 。
这里的DD表示#define DD extern
DD将无需在代码之外或标题中执行psudo
DD将不再需要在每个页面中定义外部变量
DD将无需在每个文件中执行每个标头的#includes
现在,在代码中演示的DD会在更大的代码中出现问题吗?
编辑:
我把问题编辑得更清楚了
答案 0 :(得分:5)
为什么使用char *
而不是C ++字符串?为什么要为标准函数编写自己的包装器?这些都不是一个好主意。
此外,如果你想要返回某些条件的值,你应该这样做:
return _stricmp( String1, String2 ) == 0;
而不是使用if
。
在你的头文件中总是放卫兵,如下:
#ifndef HEADER_NAME_H
#define HEADER_NAME_H
/* code */
#endif // HEADER_NAME_H
这样你就不会再包括两次了。
在C ++中,没有理由使用#define来定义类似的功能:
#define titlen L"my program"
而是简单地使用const
关键字:
const std::string titlen = "my program";
答案 1 :(得分:2)
我认为你试图使用extern和单个声明自动声明全局变量。
a)在头文件中使用普通的'extern'并且只有一个带有声明的gppbals的cpp文件就更简单了
b)你不需要为功能
执行此操作答案 2 :(得分:1)
摆脱使用全局变量的习惯。对于玩具项目他们很好,但是一旦你开始做一些更大的东西和更复杂的是,你总是遇到设计问题:
1)你的缓冲区是任意大小的,浪费内存。在某些情况下,它们甚至可能不够大。 2)全局命名空间中的对象将与全局命名空间中的其他内容发生冲突。在深入了解项目之前,这永远不会成为问题,然后它就会成为一个非常难以修复的大问题。 3)全局变量很难以不易碎的方式使线程安全。
答案 3 :(得分:1)
你已经发现可以编写这样的代码,但最终我认为你不会发现它在编写任何文件时都有帮助,但是最简单的程序。
DD是什么意思?阅读代码的其他人是否有意义?
您也可以
wchar_t titlen = L"my program";
在您的实现文件中,并且不需要在头文件中包含那些信息。
一般来说,我喜欢遵循的指导方针是尽可能多地给出任何给定范围的信息。此头文件的外部用户不需要知道您的程序名称是什么,他们只需要知道如何访问它。与数组一样,他们不需要知道它们有多大,只要知道它们的名字。
另外,我不建议将“大”标题放在你自己的标题中。例如。包括在标题中可能看起来更容易,但它会使你的程序编译花费更长的时间,没有特别的原因。
头:
extern const wchar_t titlen;
extern wchar_t gtitle[];
extern wchar_t gclass[];
extern wchar_t gdir[];
实施档案:
#include "win32.h"
#include "resources.h"
#include "commonfunctions.h"
const wchar_t titlen = L"my program";
wchar_t gtitle[512];
wchar_t gclass[512];
wchar_t gdir[32767];
将内联函数放在标题中,但不需要将它们设置为“extern”。然而,将它们设置为“静态”可以帮助您缩短链接时间,并可能减少可执行文件的大小。
编辑:换句话说,是的,你正在做的事情很糟糕,这会导致你在任何真实的项目中出现问题。
答案 4 :(得分:0)
虽然更多的是预先打字,但从长远来看,让每个模块只包含它实际需要的文件更加可维护。类似地,在包含明确标记为“extern”的include中声明标识符更为可维护,并在实现文件中写出定义。
另外,我不会因为你不喜欢返回类型而包含像'strcmp()这样的标准函数,因为它会让你习惯使用C语言而其他人都不会理解。