c ++代码缺点/专业

时间:2010-03-22 22:09:28

标签: c++

下面我有一个代码可以在我的大多数简单程序中运行.. 我想知道它是好还是坏......以及缺点/专业人士。


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指的是#define DD extern

所有全局变量前面都有 DD ,并且所有函数/ subs也都有 DD ,这将导致函数在包含时被定义为所有文件中的extern第二次

这有什么不好的一面吗? 。我提出了这个想法,在小程序中根本没有问题。但在我将它应用于大型项目之前,它会有问题吗? 。

现在问题

这里的DD表示#define DD extern
DD将无需在代码之外或标题中执行psudo DD将不再需要在每个页面中定义外部变量 DD将无需在每个文件中执行每个标头的#includes

现在,在代码中演示的DD会在更大的代码中出现问题吗?

编辑:
我把问题编辑得更清楚了

提前谢谢。

5 个答案:

答案 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)

嗯,这部分是个人风格的问题,但在我看来,你的方法会导致脆弱的项目。特别地,具有共同包含文件的概念意味着每个模块现在都依赖于包括的无定形blob,无论它们是否全部需要它们。这可能导致很难调试编译甚至是应用程序错误。

虽然更多的是预先打字,但从长远来看,让每个模块只包含它实际需要的文件更加可维护。类似地,在包含明确标记为“extern”的include中声明标识符更为可维护,并在实现文件中写出定义。

另外,我不会因为你不喜欢返回类型而包含像'strcmp()这样的标准函数,因为它会让你习惯使用C语言而其他人都不会理解。