您可以像这样在C中声明一个结构:
typedef struct MyStruct {
const char *name;
int (*func1)(void);
int (*func2)(void);
int (*func3)(void);
} MyStruct;
int test_func2(void) {
return 0;
}
MyStruct test_struct = {
.name = "buffer",
.func2 = test_func2,
};
Run Code Online (Sandbox Code Playgroud)
这对于仅定义特定成员非常方便,所有其他成员都设置为0/NULL.
编辑:特别是,这允许不知道如何定义MyStruct的细节,因此它可以在内部更改,添加新成员等.而不会破坏使用此类型的代码.
这不会用C++编译器编译,但是会收到错误:
test.c:23: error: expected primary-expression before ‘.’ token
test.c:24: error: expected primary-expression before ‘.’ token
Run Code Online (Sandbox Code Playgroud)
是否有相同的C++声明实现相同的目标?
谢谢.
编辑:@chris我可以告诉你不明白:)很明显,大多数其他人评论我应该使用什么语法,结构应该如何定义等等.完全忽略了这一点.这与定义结构的正确方法无关,此片段仅用于提供上下文.
至于代码等价,请在代码中的某处说:
MyStruct blah = { NULL, NULL, func2 };
Run Code Online (Sandbox Code Playgroud)
现在,MyStruct将其定义更改为:
typedef struct MyStruct {
const char *name;
int (*func4)(void);
int (*func1)(void);
int (*func2)(void);
int (*func3)(void);
} MyStruct; …Run Code Online (Sandbox Code Playgroud) 我正在尝试优化VLC中使用的例程,将NV12帧转换为YV12帧.
对于背景信息,NV12与YV12相同,除了U和V色度平面是交错的.因此,要将一种格式转换为另一种格式,只需将一个频道解交错:UVUVUVUVUVUVU成为UUUUUUU VVVVVVV
我试图改进的例程是:http: //git.videolan.org/?p = vlc.git; a = blob; f = module/video_chroma/copy.c; h = d29843c037e494170f0d6bc976bea8439dd6115b; hb = HEAD #l286
现在,这个例程的主要问题是它需要一个16字节对齐的内存缓存作为中间存储因此例程首先将数据解交织到缓存中(4kiB max),然后将缓存中找到的结果复制回目标帧.
我已经重写了这个函数,所以它不需要使用缓存,在需要时使用SSE2/3指令处理未对齐的内存,并且尽可能使用对齐的内存.
代码如下:
static void SSE_SplitPlanes(uint8_t *dstu, size_t dstu_pitch,
uint8_t *dstv, size_t dstv_pitch,
const uint8_t *src, size_t src_pitch,
uint8_t *cache, size_t cache_size,
unsigned width, unsigned height, unsigned cpu)
{
VLC_UNUSED(cache);
VLC_UNUSED(cache_size);
const uint8_t shuffle[] = { 0, 2, 4, 6, 8, 10, 12, 14,
1, 3, 5, 7, 9, 11, 13, 15 };
const uint8_t mask[] = …Run Code Online (Sandbox Code Playgroud) 我试图拦截点击WebBrowser控件中的链接.我的HTML页面包含自定义链接,对于一些以shared开头的链接://我想在用户点击它时拦截.
在iPhone上,我将使用webView:shouldStartLoadWithRequest:navigationType:方法,并查看所选的URL.
我还没有设法使用Silverlight for Windows Phone重现类似的行为.
我做的事情如下:
{
webBrowser1.Navigating += new EventHandler<NavigatingEventArgs>(webBrowser1_Navigating);
}
void webBrowser1_Navigating(object sender, NavigatingEventArgs e)
{
string scheme = null;
try
{
scheme = e.Uri.Scheme; // <- this is throwing an exception here
}
catch
{
}
if (scheme == null || scheme == "file")
return;
// Not going to follow any other link
e.Cancel = true;
if (scheme == "shared")
{
}
Run Code Online (Sandbox Code Playgroud)
但是当我读取Uri的一些属性时,我认为这是一个异常,当它是带有默认文件的标准Uri时:// URL此外,对于以shared://开头的链接,甚至不会触发导航事件
现在我能够捕获一个共享://我不在乎,但至少我希望能够检索我们要导航到的URL,并取消默认操作特定的URL.
有什么想法发生了什么?谢谢
编辑:事实证明,问题是只为以下链接生成导航事件:file://,http://或mailto:// Uri的scheme属性仅适用于http://和mailto://链接
所以我最后做的是用http:// shared/blah替换shared://链接......我看看这个URL ......这对我有用.我现在可以拥有具有不同操作的链接(比如打开一个额外的窗口),具体取决于html中的链接.
我正面临一个最近才开始的令人费解的问题.
我有一个程序,它使用一个线程写入文件,另一个线程从该文件中读取.两个线程都使用不同的文件描述符.写入程序线程使用O_WRONLY标志打开文件,读取器线程以O_RDONLY模式打开文件.就逻辑而言,读者线程不知道编写器线程正在做什么,并且两者都可以使用不同的文件.
写入程序线程以固定间隔连续写入文件(数据来自设备流,速度高达20Mbit/s).
读者线程也定期读取文件.
这是读者循环:
while (tot < sz)
{
LOG(VB_FILE, LOG_DEBUG, LOC +
QString("read(%1) -- begin").arg(sz-tot));
ret = read(fd2, (char *)data + tot, sz - tot);
LOG(VB_FILE, LOG_DEBUG, LOC +
QString("read(%1) -> %2 end").arg(sz).arg(ret));
if ((sz - tot) != ret)
{
LOG(VB_FILE, LOG_DEBUG, LOC + QString("errno = %1").arg(errno));
}
if (ret < 0)
{
if (errno == EAGAIN)
{
LOG(VB_FILE, LOG_DEBUG, LOC +
QString("read(%1) -> %2 EAGAIN").arg(sz).arg(ret));
usleep(1000);
continue;
}
LOG(VB_GENERAL, LOG_ERR,
LOC + "File I/O problem in 'safe_read()'" …Run Code Online (Sandbox Code Playgroud) 我试图了解潜在的情况以及它是否可能是一个问题.
所以我有一个当前线程安全的静态函数.功能如下:
static thread_safe_func()
{
... process
}
Run Code Online (Sandbox Code Playgroud)
现在在这个函数中,我添加以下内容:
static thread_safe_func()
{
static const Class::NonThreadSafeClassName() *array[16] = {
Class::NonThreadSafeClassName(),
Class::NonThreadSafeClassName(),
Class::NonThreadSafeClassName(),
Class::NonThreadSafeClassName(),
Class::NonThreadSafeClassName(),
Class::NonThreadSafeClassName(),
Class::NonThreadSafeClassName(),
}
... code continues here
}
Run Code Online (Sandbox Code Playgroud)
现在它本身是线程安全的吗?数组将在应用程序的整个生命周期内初始化一次,因此一旦函数thread_safe_func()被调用并完全运行,我希望这是线程安全的.
问题显然是在第一次调用期间可能发生的情况,在线程调用thread_safe_func()的情况下会发生什么,const数组的初始化发生,但在初始化完成之前,另一个线程正在调用thread_safe_func().
会改为:
static ClassMutex lock = ClassMutex()
static thread_safe_func()
{
lock.Lock()
static const Class::NonThreadSafeClassName() *array[16] = {
Class::NonThreadSafeClassName(),
Class::NonThreadSafeClassName(),
Class::NonThreadSafeClassName(),
Class::NonThreadSafeClassName(),
Class::NonThreadSafeClassName(),
Class::NonThreadSafeClassName(),
Class::NonThreadSafeClassName(),
}
lock.Unlock()
... code continues here
}
Run Code Online (Sandbox Code Playgroud)
是否值得并保证此代码现在是线程安全的?
假设我们有类似的东西:
class U {
...
}
Run Code Online (Sandbox Code Playgroud)
和:
class T {
T(const U&) { ... }
}
Run Code Online (Sandbox Code Playgroud)
现在我可以像这样声明一个变量:
U foo;then T blah(foo);或T blah = foo
我个人更喜欢后者.
现在,我应该将T拷贝构造函数更改为:
class T {
explicit T(const U&) { ... }
}
Run Code Online (Sandbox Code Playgroud)
我只能声明一个变量:
T blah(foo); T blah = foo;将给我一个关于将U转换为T的不可能性的编译错误.
http://en.cppreference.com/w/cpp/language/explicit解释了这种行为:"指定构造函数和(自C++ 11以来)不允许隐式转换或复制初始化的转换运算符."
现在,我工作的人要求我们所有的构造函数都是明确的.作为一个老屁,我不喜欢太多改变我的编码风格而忘记T blah = ...风格.
这样的问题是:"有没有办法在允许复制初始化语法的同时使构造函数显式化?"
将构造函数显式化是有充分理由的,而且大多数情况下,您确实希望将其显式化.
在这些情况下,我认为我可以做以下事情:
class T {
template<typename = V>
T(const V&) = delete;
T(const U&) { ... }
}
Run Code Online (Sandbox Code Playgroud)
这将是一个全能的构造函数,禁止所有转换但我真正想要的转换.
想知道是否有一些我可以使用的技巧.
谢谢 …
自从升级到Lion并因此升级到XCode 4.1
运行分析器时,我收到了数十个"潜在的内存泄漏".
我通常会使用如下属性列表:
@synthesize indexPath = _indexPath;
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
self = [super initWithNibName:nibName bundle:nibBundle];
self.indexPath = [[NSIndexPath alloc] init];
[_indexPath release];
return self;
}
Run Code Online (Sandbox Code Playgroud)
并在dealloc()方法中:
- (void)dealloc {
[_indexPath release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
现在,分析会告诉我self.indexPath上可怕的蓝色消息,告诉我有泄漏.什么时候显然没有.
你如何分配和格式化代码,以便XCode不相信它的泄漏?(同时保留属性别名self.var vs _var)
谢谢...
我有一个针对最低平台10.5的应用程序,它可以通过SDK 10.6或10.7进行编译.
但是,当使用旧版本的xcode和10.5 SDK进行编译时,编译失败并需要一些额外的#import(为什么我不确定,但确实如此).当我导入OpenGL标头时,我收到一些关于某些类型未解决的错误.添加#import <CarbonCore/Endian.h>修复问题(缺少的符号所在的位置).
除非绝对必要,否则我不想执行#import,特别是在使用10.6或10.7编译时不执行此操作.
我知道如何检查我是否使用优于给定版本的SDK,如下所示:
#if MAC_OS_X_VERSION_10_5 > MACS_VERSION_MIN_REQUIRED
// Mac > 10.5 code here
#endif
Run Code Online (Sandbox Code Playgroud)
问题是测试反向条件已被证明是非平凡的,因为SDK的所有后续版本都具有早期版本中的所有定义.
我想找到相当于:
#if COMPILING_WITH_10_5_OR_EARLIER
blah
#endif
Run Code Online (Sandbox Code Playgroud)
当然,必须有一个我忽略的简单方法
目前将应用程序移植到Windows Phone 7我遇到了一个应该是微不足道的问题
我想要的只是改变TextBlock的背景颜色.使用WYSIWYG我可以轻松创建TextBlock,更改前景色和背景色.所以对于在黑色背景上使用白色文本的TextBlock,我会使用:
<TextBox Height="148" HorizontalAlignment="Left" Margin="106,0,0,0" Name="textBox1" Text="TextBox" VerticalAlignment="Top" Width="460" Background="Black" BorderBrush="Black" Foreground="White" />
Run Code Online (Sandbox Code Playgroud)
但我需要在代码(C#)中执行它,而Background似乎不是TextBlock的属性.为什么你可以使用资源编辑器来做,但不能在代码中做?
我发现了各种类似的问题,但没有明确的答案.在Microsoft文档(.Net)中,TextBlock似乎确实具有Background属性
有没有办法在代码中执行此操作而不必将TextBlock放在具有Background属性的容器(如Grid)中?谢谢JY
我在页面中有一个WebBrowser元素,我想在其中添加一个后退和前进按钮,并且当没有任何内容可以返回时将这些按钮禁用.
在Cocoa中,UIWebView有方法可以轻松检查:canGoBack和canGoForward,并且你可以使用goBack和goForward方法(以及重载等).
Android具有完全相同的方法名称.
我看到这些方法在.Net 4和3.5 SP1中可用.
我发现了一些关于在Silverlight中使用javascript命令的参考文献,但我发现这非常麻烦,而且无法检测历史记录中是否有任何内容(当然除非我自己管理)
当然,Windows Phone中有一些更先进的东西..