小编Dev*_*lus的帖子

使用typedef重载会产生错误

考虑以下类型:

#include <iostream>

typedef unsigned long long      usize_t;
typedef unsigned __int16        uword_t;
typedef uword_t                 clockval_t;     // time without seconds in format HHMM

std::string toString(clockval_t nClock)
{
    return std::to_string((usize_t)nClock/100) + ":" + std::to_string((usize_t)nClock % 100);
}

std::string toString(uword_t nValue)
{
    return std::to_string((usize_t)nValue);
}

void test(void)
{
    uword_t val = 1;
    clockval_t time = 1023; // 10:23

    std::cout << "Value: " << toString(val);
    std::cout << "time: " << toString(time);
}
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试编译它时,我从编译器收到一个错误,告诉我std::string toString(clockval_t)已经有一个正文.我理解为什么会发生这种情况,因为typedef只是一个别名uword_t.

AFAIK唯一的解决方案是提供单独的方法:

std::string toClockString(clockval_t);
Run Code Online (Sandbox Code Playgroud)

或使它成为一个对象:

class clockval …
Run Code Online (Sandbox Code Playgroud)

c++ overloading

7
推荐指数
1
解决办法
187
查看次数

使用DLL /共享库中的命名空间

我正在编写一个带辅助函数的共享库/ DLL.所以我声明名称空间不会在将来发生名称冲突.对于类,这工作正常,但我有一些全局函数,我也想放在命名空间中,这不起作用.当我尝试寻址命名空间时,我收到链接器错误.看起来好像无法从DLL内部导出命名空间.

我用Google搜索并在此处找到此线程我应该将DECLSPEC用于命名空间?我并不完全理解答案.命名空间的要点是分隔名称并使它们无法识别,所以我想知道为什么它是一个公认的答案,说不需要导出namspace.但是,也许我在这里遗漏了一些东西.我可以看到它自己的命名空间无法导出,但里面的函数仍然属于命名空间,这似乎是不可能的.但是,我在命名空间中使用的类按预期工作,所以我有点困惑为什么这不应用于其他符号.

我现在通过创建一个虚拟类包装器并将我的函数声明为静态来结束.它不像命名空间那样100%,但它与我的目的相似.

在DLL中:

class EXPORT_DECL Base64
{
   public:
       static std::string encode(unsigned char const *bytes_to_encode, unsigned int in_len);
       static std::string decode(std::string const &oBase64Encoded);
};
Run Code Online (Sandbox Code Playgroud)

在主要方面,我可以像在命名空间中一样解决它们.

Base64::encode(...);
Run Code Online (Sandbox Code Playgroud)

我想知道,如果我在这里遗漏了一些东西,可以使用命名空间而不是使用这种解决方法.并且共享库也有这个限制,或者这只是来自DLL的东西?

更新

共享库foo.h:

namespace mytest
{
     int mytestfkt(int a);
     EXPORT_DECL int decltest(int a);
}
Run Code Online (Sandbox Code Playgroud)

共享库foo.cpp.

 int mytestfkt(int a)
 {
     return 0;
 }

int decltest(int a)
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

或这个:

namespace mytest
{
 int mytestfkt(int a)
 {
     return 0;
 }

 EXPORT_DECL int decltest(int a)
{
    return 0;
}
}
Run Code Online (Sandbox Code Playgroud)

或这个:

int …
Run Code Online (Sandbox Code Playgroud)

c++ dll namespaces shared-libraries

6
推荐指数
1
解决办法
3468
查看次数

C和C++静态初始化之间的区别

编译此代码示例时

#include <stdio.h>
#include <stdlib.h>

int myfunc()
{
    printf("Constructor\n");
    return 1;
}

static const int dummy = myfunc();

int main()
{
    printf("main\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它在编译为C++时有效,但在使用相同的编译器(MingW gcc)时不能用作C语言.我得到一个initializer element is not constantC模式.

显然静态初始化存在差异.是否有理由为C++显然允许这样做而不是C?这是因为否则你将无法拥有带构造函数的全局对象?

c c++

6
推荐指数
1
解决办法
245
查看次数

从相对路径加载c#中的dll

我在运行时加载一个dll,如下所示:

var DLL = Assembly.LoadFile(@"..\..\BuildDLLs\myDLL.dll");
Run Code Online (Sandbox Code Playgroud)

我收到一个要求绝对路径的ArgumentException.

我不想使用绝对路径,我想使用相对路径.

我怎样才能做到这一点?

c# dll .net-assembly

6
推荐指数
1
解决办法
4864
查看次数

具有多个重载的“using”关键字

我一直在阅读如何使用using-declaration,并且想知道当我有多个重载时会发生什么。在给出的示例中,看起来似乎是全部或全部都没有,或者是否可以仅提取范围内的某个签名?

假设我有以下课程:

class A
{
public:
   void function(int value);
   void function(double value);
   void function(const char *value);
};


class B : public A
{
public:
    using A::function;
    void function(uint64_t value);
};
Run Code Online (Sandbox Code Playgroud)

现在使用class B关键字using,我将基类成员引入到我的类命名空间中。但这意味着现在所有这些都可用,对吧?或者我也可以指定签名吗,因为我只想介绍其中之一,而不是全部。从给出的例子来看,我预计不会。因此,在这种情况下,我必须将此类函数的声明移至protectedprivate禁用对其的访问,对吗?

c++

6
推荐指数
1
解决办法
224
查看次数

我不明白这个扩展程序集内联代码在C中

这是一个使用扩展汇编代码的C函数:

static inline uint
xchg(volatile uint *addr, uint newval)
{
    uint result;
    asm volatile("lock; xchgl %0, %1" :
                "+m" (*addr), "=a" (result) :
                "1" (newval) :
                "cc");
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我读了这个codeproject链接,了解如何在C代码中使用Extended Assembly,但我对此代码感到困惑.我不明白这段代码中的内容:
1)(newval)汇编代码中哪里用作输入?(%0是指(*addr)%1被参考(result)吧?然后"1" (newval)从来没有在代码中使用(我们从来没有看到%2在代码).或者我错了?)
2)什么是"1""1" (newval)输入操作数?
3)什么是"+m"标志意味着"+m" (*addr)什么?

c assembly inline-assembly

5
推荐指数
1
解决办法
477
查看次数

Qt5中的Splitter是不可见的

我一直在使用 Qt Designer 创建一个带有分割器对象的小框架窗口。但奇怪的是,分割器正在工作,所以当我将鼠标移动到它应该在的位置时,光标会切换它的形状,我可以拖动分割器,但分割器栏本身是不可见的。

这是 Qt5 的错误吗?我在 Windows 7 上使用 Qt 5.2.1 OpenSource 和 MingW。

缺少分离器的屏幕截图
(来源:picr.de

更新

我现在为此问题创建了一个错误报告

c++ mingw qt5

5
推荐指数
1
解决办法
1966
查看次数

QListWidget MultiSelection始终进行多项选择

我正在使用QListWidget并启用了多个选择:

mReferenceList->setSelectionMode(QAbstractItemView::MultiSelection);
Run Code Online (Sandbox Code Playgroud)

问题是,此模式的行为与Windows上的标准不符.通常,具有多个选项的列表框的工作方式是您单击项目,单击另一个,并且取消选择前一个项目.仅当您使用SHIFT+ LButtonCTRL+时LButton才会选择多个项目.

目前,当我点击几个项目时,列表框现在会选择一个项目.是否有一些设置可以实现这个beahviour?

我正在使用Qt 5.2和MingW.

c++ qt qlistwidget multi-select

5
推荐指数
1
解决办法
2223
查看次数

Visual Studio 仅转到当前文件内的书签

是否可以仅在当前文件内转到下一个/上一个书签?我正在使用 VS 2010,当我只想在当前文件中导航时,它总是跳过所有文件,这让我觉得非常烦人。

c c++ visual-studio-2010

5
推荐指数
1
解决办法
1089
查看次数

静态初始化器在库中时被优化掉

我有一个静态调用初始化例程的函数。这是插件系统所需要的,其中插件要么是动态加载的(工作正常),要么也可以是静态链接的。由于主应用程序不知道静态插件,它必须注册自己,以便主应用程序知道它(就像它是动态加载的插件一样)。

现在的问题是初始化从未被调用。但是,当我添加一个虚拟函数并从主应用程序调用它时,初始化程序突然被调用。所以这在我看来好像初始化是从 gcc 中“优化”的。

static bool registerPlugins(void)
{
    std::cout << "Registering CSV static plugin ... " << std::endl;
    PluginManager::registerStaticPlugin(&PluginInfo);

    return true;
}
static bool gCSVRegistered = registerPlugins();
Run Code Online (Sandbox Code Playgroud)

永远不会打印文本“正在注册...”,但添加了虚拟功能

void helper(void)
{
    std::cout << "Registered: "  << gCSVRegistered << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

...并从主应用程序中调用它,然后打印所有期望的文本。

那么我怎样才能强制静态初始化器不被扔掉???

我正在将 Mingw32 与 gcc 4.9.2 一起使用(仅供记录:))。

重要更新:相关代码在静态库中。在这种情况下,它不会被触发,只有当模块直接链接到主应用程序时才会调用初始化器。

南昌

main.cpp:

#include <iostream>

const char *gData = NULL;

int main()
{
    if(gData)
        std::cout << "Registration: " << gData << std::endl;
    else
        std::cout << "Registration: NULL" << std::endl;

    return 0;
} …
Run Code Online (Sandbox Code Playgroud)

c++ gcc

5
推荐指数
1
解决办法
1437
查看次数