考虑以下类型:
#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) 我正在编写一个带辅助函数的共享库/ 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) 编译此代码示例时
#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 constant
C模式.
显然静态初始化存在差异.是否有理由为C++显然允许这样做而不是C?这是因为否则你将无法拥有带构造函数的全局对象?
我在运行时加载一个dll,如下所示:
var DLL = Assembly.LoadFile(@"..\..\BuildDLLs\myDLL.dll");
Run Code Online (Sandbox Code Playgroud)
我收到一个要求绝对路径的ArgumentException.
我不想使用绝对路径,我想使用相对路径.
我怎样才能做到这一点?
我一直在阅读如何使用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
,我将基类成员引入到我的类命名空间中。但这意味着现在所有这些都可用,对吧?或者我也可以指定签名吗,因为我只想介绍其中之一,而不是全部。从给出的例子来看,我预计不会。因此,在这种情况下,我必须将此类函数的声明移至protected
或private
禁用对其的访问,对吗?
这是一个使用扩展汇编代码的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)
什么?
我一直在使用 Qt Designer 创建一个带有分割器对象的小框架窗口。但奇怪的是,分割器正在工作,所以当我将鼠标移动到它应该在的位置时,光标会切换它的形状,我可以拖动分割器,但分割器栏本身是不可见的。
这是 Qt5 的错误吗?我在 Windows 7 上使用 Qt 5.2.1 OpenSource 和 MingW。
(来源:picr.de)
更新
我正在使用QListWidget
并启用了多个选择:
mReferenceList->setSelectionMode(QAbstractItemView::MultiSelection);
Run Code Online (Sandbox Code Playgroud)
问题是,此模式的行为与Windows上的标准不符.通常,具有多个选项的列表框的工作方式是您单击项目,单击另一个,并且取消选择前一个项目.仅当您使用SHIFT+ LButton或CTRL+时LButton才会选择多个项目.
目前,当我点击几个项目时,列表框现在会选择一个项目.是否有一些设置可以实现这个beahviour?
我正在使用Qt 5.2和MingW.
是否可以仅在当前文件内转到下一个/上一个书签?我正在使用 VS 2010,当我只想在当前文件中导航时,它总是跳过所有文件,这让我觉得非常烦人。
我有一个静态调用初始化例程的函数。这是插件系统所需要的,其中插件要么是动态加载的(工作正常),要么也可以是静态链接的。由于主应用程序不知道静态插件,它必须注册自己,以便主应用程序知道它(就像它是动态加载的插件一样)。
现在的问题是初始化从未被调用。但是,当我添加一个虚拟函数并从主应用程序调用它时,初始化程序突然被调用。所以这在我看来好像初始化是从 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++ ×8
c ×3
dll ×2
assembly ×1
c# ×1
gcc ×1
mingw ×1
multi-select ×1
namespaces ×1
overloading ×1
qlistwidget ×1
qt ×1
qt5 ×1