似乎有3种方法告诉GCC弱连接符号:
__attribute__((weak_import))__attribute__((weak))#pragma weak symbol_name这些都不适合我:
#pragma weak asdf
extern void asdf(void) __attribute__((weak_import, weak));
...
{
if(asdf != NULL) asdf();
}
Run Code Online (Sandbox Code Playgroud)
我总是得到这样的链接错误:
Undefined symbols:
"_asdf", referenced from:
_asdf$non_lazy_ptr in ccFA05kN.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
我在OS X 10.5.5上使用GCC 4.0.1.我究竟做错了什么?
是否有任何文档描述了Windows应用程序清单的所有有效元素,它们所在的命名空间以及哪些Windows版本将使用它们?到目前为止,我发现的所有文档只描述了清单的一部分,并且我看到了用于同一元素的不同XML命名空间.
到目前为止我发现了什么:
urn:schemas-microsoft-com:asm.v1命名空间文档和compatibility/ supportedOSstuff(来自urn:schemas-microsoft-com:compatibility.v1命名空间).它有一个链接,这不一个模式文件不具有compatibility/ supportedOS东西.trustInfo/ requestedExecutionLevelstuff 记录在urn:schemas-microsoft-com:asm.v2命名空间中.但是,我已经看到其他地方说它在urn:schemas-microsoft-com:asm.v3命名空间中.application/ windowsSettings/ .dpiAwareurn:schemas-microsoft-com:asm.v3http://schemas.microsoft.com/SMI/2005/WindowsSettingsdependency在urn:schemas-microsoft-com:asm.v2命名空间中,而上面的第一个引用暗示它在该urn:schemas-microsoft-com:asm.v1命名空间).我揣摩如何在新system_error一起error_code,error_category而不是(是为了执行最低便携式错误报告)error_condition应该被使用.
我想通过阅读boost.system我明白我应该如何使用error_codes和error_category.该描述省略了在使用system_error`抛出异常时如何结合使用,但是从我可以猜到的那个类的接口.
class system_error : public runtime_error {
public:
// [...]
system_error(error_code ec, const string& what_arg);
system_error(int ev, const error_category& ecat, const string& what_arg);
system_error(int ev, const error_category& ecat);
// [...]
Run Code Online (Sandbox Code Playgroud)
所以,我抛出一个system_error-exception与右int+ error_category或error_code与它的error_category()-方法.
但是提供便携式接口的方式是什么error_condition?
双方error_code 并 error_category都有方法default_error_condition:
class error_category {
public:
// [...]
virtual error_condition default_error_condition(int ev) …Run Code Online (Sandbox Code Playgroud) 在关于无限循环的编码风格问题中,有些人提到他们更喜欢for(;;)样式,因为while(true)样式在MSVC上给出关于条件表达式是常量的警告消息.
这让我感到非常惊讶,因为在条件表达式中使用常量值是避免#ifdef地狱的有用方法.例如,您可以在标题中:
#ifdef CONFIG_FOO
extern int foo_enabled;
#else
#define foo_enabled 0
#endif
Run Code Online (Sandbox Code Playgroud)
代码可以简单地使用条件并信任编译器在未定义CONFIG_FOO时删除死代码:
if (foo_enabled) {
...
}
Run Code Online (Sandbox Code Playgroud)
每次使用foo_enabled时,不必测试CONFIG_FOO:
#ifdef CONFIG_FOO
if (foo_enabled) {
...
}
#endif
Run Code Online (Sandbox Code Playgroud)
这种设计模式一直在Linux内核中使用(例如,include/linux/cpumask.h在禁用SMP时将几个宏定义为1或0,在启用SMP时定义为函数调用).
MSVC警告的原因是什么?另外,有没有更好的方法来避免#ifdef hell而不必禁用该警告?或者这是一个过于广泛的警告,一般不应该启用?
我正在寻找一个适合嵌入式Linux设备(Linux和uClinux)的开源消息总线.
它需要满足以下标准:
消息总线主要由我们系统上的应用程序使用,以便传递配置参数等,因此它不需要满足实时要求.
C++ 0x有两个预定义的error_category对象:generic_category()和system_category().从我到目前为止所理解的,system_category()应该用于操作系统返回的错误,并且generic_category()应该用于找到的通用值std::errc,它们对应于errno值.
但是,在类Unix系统上应该做些什么,其中errno值是操作系统返回的错误?我应该使用system_category()(在非类Unix系统上会出错,需要#ifdef),还是应该使用generic_category()(对于非标准errno值,类Unix系统会出错)?
如果我尝试编译以下C++ 0x代码,我收到一个错误:
template<int n> struct foo { };
struct bar {
static constexpr int number() { return 256; }
void function(foo<number()> &);
};
Run Code Online (Sandbox Code Playgroud)
使用gcc 4.6.1,错误消息是:
test.cc:6:27: error: ‘static constexpr int bar::number()’ used before its definition
test.cc:6:28: note: in template argument for type ‘int’
Run Code Online (Sandbox Code Playgroud)
使用clang 2.8,错误消息是:
test.cc:6:20: error: non-type template argument of type 'int' is not an integral
constant expression
void function(foo<number()> &);
^~~~~~~~
1 error generated.
Run Code Online (Sandbox Code Playgroud)
如果我将constexpr函数移动到基类,它适用于gcc,并在clang上给出相同的错误消息:
template<int n> struct foo { };
struct base {
static constexpr …Run Code Online (Sandbox Code Playgroud) 有没有办法在不使用SetSysColors的情况下为单个进程更改普通Win32菜单(背景,文本和高亮显示)使用的颜色?
(SetSysColors执行全局更改,这很糟糕,如果您在退出之前崩溃或忘记再次使用SetSysColors设置颜色,则在您注销之前不会恢复它们.)