小编xto*_*ofl的帖子

枚举类型的命名空间 - 最佳实践

通常,人们需要一起使用几种枚举类型.有时,一个人有一个名字冲突.我想到了两种解决方案:使用命名空间,或使用"更大"的枚举元素名称.仍然,命名空间解决方案有两种可能的实现:具有嵌套枚举的虚拟类或完整的命名空间.

我正在寻找这三种方法的优缺点.

例:

// oft seen hand-crafted name clash solution
enum eColors { cRed, cColorBlue, cGreen, cYellow, cColorsEnd };
enum eFeelings { cAngry, cFeelingBlue, cHappy, cFeelingsEnd };
void setPenColor( const eColors c ) {
    switch (c) {
        default: assert(false);
        break; case cRed: //...
        break; case cColorBlue: //...
        //...
    }
 }


// (ab)using a class as a namespace
class Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; };
class Feelings { enum e { cAngry, cBlue, cHappy, cEnd …
Run Code Online (Sandbox Code Playgroud)

c++ enums scope nested

98
推荐指数
7
解决办法
7万
查看次数

检查所有数组项是否为空PHP

我正在从表单添加一个项目数组,如果所有项目都是空的,我想执行一些验证并添加到错误字符串.所以我有:

$array = array(
    'RequestID'       => $_POST["RequestID"],
    'ClientName'      => $_POST["ClientName"],
    'Username'        => $_POST["Username"],
    'RequestAssignee' => $_POST["RequestAssignee"],
    'Status'          => $_POST["Status"],
    'Priority'        => $_POST["Priority"]
);
Run Code Online (Sandbox Code Playgroud)

然后,如果所有数组元素都为空,则执行:

$error_str .= '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';
Run Code Online (Sandbox Code Playgroud)

php arrays validation

72
推荐指数
3
解决办法
6万
查看次数

我可以将普通文件链接到我的可执行文件吗?

一些框架(Qt,Windows,Gtk ...)提供了向二进制文件添加资源的功能.我想知道是否有可能在没有框架的情况下实现这一点,因为所有真正需要的是

  1. 包含二进制(数据段)内资源地址的符号
  2. 表示资源长度的符号
  3. 资源本身

如何使用gcc工具链实现这一目标?

c c++ linker gcc embedded-resource

46
推荐指数
2
解决办法
1692
查看次数

XML头中的'encoding'有什么用?

查看XML标头

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
Run Code Online (Sandbox Code Playgroud)

我是否正确地声明encoding属性是

  • 来得太晚了(除非你知道编码,否则你无法正确阅读...)
  • 冗余,因此容易出错:用"Big5"替换它很容易,但用UTF-8保存文件

或者该属性不是关于流的内容

我在这里混淆了什么吗?

xml header character-encoding

42
推荐指数
2
解决办法
3万
查看次数

为何/何时不需要__declspec(dllimport)?

在使用server.dll和client.exe的项目中,我dllexport从服务器dll编辑了一个服务器符号,而不是将其 dllimport编辑到客户端exe中.

仍然,应用程序链接,并启动,没有任何问题.是dllimport不需要的,那么???

细节:

我有这个'服务器'DLL:

// server.h
#ifdef SERVER_EXPORTS
  #define SERVER_API __declspec(dllexport)
#else
  #define SERVER_API // =====> not using dllimport!
#endif
class  SERVER_API CServer {
   static long s;
   public:
   CServer();
};

// server.cpp
CServer::CServer(){}

long CServer::s;
Run Code Online (Sandbox Code Playgroud)

这个客户端可执行文件

#include <server.h>
int main() {
   CServer s;
}
Run Code Online (Sandbox Code Playgroud)

服务器命令行:

cl.exe /Od  /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" 
 /D "SERVER_EXPORTS" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" 
 /Gm /EHsc /RTC1 /MDd /Yu"stdafx.h" 
 /Fp"Debug\server.pch" /Fo"Debug\\" /Fd"Debug\vc80.pdb" 
 /W3 /nologo …
Run Code Online (Sandbox Code Playgroud)

c++ dllimport visual-c++-2005 declspec

37
推荐指数
1
解决办法
9279
查看次数

如何使用#pragma message()以便消息指向文件(lineno)?

为了将"todo"项添加到我的代码中,我想在编译器输出中添加一条消息.
我希望它看起来像这样:

c:/temp/main.cpp(104): TODO - add code to implement this
Run Code Online (Sandbox Code Playgroud)

为了利用Visual Studio构建输出功能,通过双击导航到相应的行.

__LINE__宏似乎扩展到了一个int不允许写作的

#pragma message( __FILE__ "("__LINE__"): ..." )
Run Code Online (Sandbox Code Playgroud)

会有另一种方式吗?

c++ pragma visual-studio-2010 line-numbers predefined-macro

32
推荐指数
3
解决办法
4万
查看次数

但我不希望我的COM库有.lib或.exp文件!

使用VisualStudio生成COM dll时,我真正需要的是DllCanUnloadNow从dll本身导出的符号(以及三个相关的符号). 没有人会链接到我的库,所以我(根本没有)对.lib文件或.exp文件感兴趣.

但是,我没有设法禁止创建这些文件.(注意:我确实知道在构建后的步骤中如何删除它们)

这些是我的链接器参数:

/OUT:"u:/cada-nt/bin/PData.dll" 
/INCREMENTAL:NO 
/NOLOGO 
/DLL 
/MANIFEST:NO 
/DEF:"PData.def" 
/DEBUG 
/PDB:"u:/cada-nt/pdb/PData.pdb" 
/ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
                    advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib 
                    odbc32.lib odbccp32.lib
Run Code Online (Sandbox Code Playgroud)

问题:

  • 有没有人成功生成.lib和.exp文件?
  • 有谁知道为什么生成这些文件?

c++ visual-studio

24
推荐指数
3
解决办法
8563
查看次数

使用`snprintf_s`虚假的安全感

MSVC的"安全" sprintf功能具有"知道"目标缓冲区大小的模板版本.但是,这段代码在结束后很快就在堆栈中绘制了567890 bytes...

char bytes[5];
_snprintf_s( bytes, _TRUNCATE, "%s", "1234567890" );
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么,或者这是一个已知的错误?

(我在VS2005工作 - 没有在2008年或2010年测试)

c++ visual-studio-2005 visual-c++ visual-c++-2005

22
推荐指数
1
解决办法
8473
查看次数

关于嵌套Java try/finally代码三明治的建议

我想对我遇到的技术提出一些建议.通过查看代码片段可以很容易地理解它,但我在以下段落中对其进行了更多的记录.


使用"Code Sandwich"习惯用法是处理资源管理的常用方法.用于C++的RAII习语,我切换到Java并发现我的异常安全的资源管理导致了深层嵌套的代码,我很难掌握常规控制流.

显然(java数据访问:这是java数据访问代码的好风格,还是最终尝试太多了?,Java io丑陋的try-finally阻塞等等)我并不孤单.

我尝试了不同的解决方案来应对这个问题:

  1. 明确地维护程序状态:resource1aquired,fileopened...,并有条件地清理:if (resource1acquired) resource1.cleanup()...但我避免在显式变量中复制程序状态 - 运行时知道状态,我不想关心它.

  2. 包装在每个功能块嵌套-结果更难遵循控制流程,并为真正尴尬的函数名称:runResource1Acquired( r1 ),runFileOpened( r1, file ),...

最后,我在一些关于代码三明治的研究论文的支持下(概念上)得到了一个成语:


而不是这个:

// (pseudocode)
try {
   connection = DBusConnection.SessionBus(); // may throw, needs cleanup
   try {
        exported = false;
        connection.export("/MyObject", myObject ); // may throw, needs cleanup
        exported = true;
            //... more try{}finally{} nested blocks
    } finally {
        if( exported ) connection.unExport( "/MyObject" );
    } …
Run Code Online (Sandbox Code Playgroud)

java try-finally

21
推荐指数
1
解决办法
2010
查看次数

循环中的最后一个元素是否值得单独处理?

在审阅时,我有时会遇到这种循环:

i = begin
while ( i != end ) {    
   // ... do stuff
   if ( i == end-1 (the one-but-last element) ) {
      ... do other stuff
   }
   increment i
}
Run Code Online (Sandbox Code Playgroud)

然后我问这个问题:你会写这个吗?

i = begin
mid = ( end - begin ) / 2 // (the middle element)
while ( i != end ) {    
   // ... do stuff
   if ( i > mid ) {
      ... do other stuff
   }
   increment i
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这超过了编写循环的意图:你循环,因为每个元素都有一些共同点.使用此构造,对于某些元素,您可以执行不同的操作.因此,我总结说,您需要为这些元素单独的循环:

i = begin …
Run Code Online (Sandbox Code Playgroud)

language-agnostic loops for-loop control-structure while-loop

19
推荐指数
6
解决办法
4149
查看次数