小编And*_*eas的帖子

括号中的 C 函数声明显然永远调用自身,有什么意义?

gatomic.cglib 中,有几个函数声明如下所示:

gboolean
(g_atomic_int_compare_and_exchange_full) (gint *atomic,
                                          gint  oldval,
                                          gint  newval,
                                          gint *preval)
{
  return g_atomic_int_compare_and_exchange_full (atomic, oldval, newval, preval);
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这段代码到底是做什么的吗?我对这里的几件事感到困惑:

  1. 函数名称g_atomic_int_compare_and_exchange_full位于括号内。这有什么意义呢?

  2. 该函数的主体显然只包含对函数本身的调用,因此这将永远运行并导致堆栈溢出(双关语)。

我根本无法理解这个函数声明。这里究竟发生了什么?

c macros function glib function-declaration

89
推荐指数
3
解决办法
8385
查看次数

为什么我不能访问指向堆栈数组指针的指针?

请看下面的代码。它尝试将数组作为 achar**传递给函数:

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

static void printchar(char **x)
{
    printf("Test: %c\n", (*x)[0]);
}

int main(int argc, char *argv[])
{
    char test[256];
    char *test2 = malloc(256);

    test[0] = 'B';
    test2[0] = 'A';

    printchar(&test2);            // works
    printchar((char **) &test);   // crashes because *x in printchar() has an invalid pointer

    free(test2);

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

事实上,我只能通过显式转换&test2char**已经暗示这段代码是错误的来编译它。

不过,我想知道它到底有什么问题。我可以传递一个指向动态分配数组的指针的指针,但我不能传递指向堆栈上数组指针的指针。当然,我可以通过首先将数组分配给临时变量来轻松解决该问题,如下所示:

char test[256];
char *tmp = test;
test[0] = 'B';
printchar(&tmp);
Run Code Online (Sandbox Code Playgroud)

不过,有人可以向我解释为什么不能直接投射char[256]char**吗?

c

35
推荐指数
3
解决办法
2186
查看次数

如何使用-Xlint重新编译:弃用

我不使用Android Studio,但我使用命令行构建所有内容build.gradle.我生成一个像这样的Lint报告:

./gradlew lint
Run Code Online (Sandbox Code Playgroud)

这正确地生成了一个Lint报告,但它也说明了这一点:

Note: MyActivity.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Run Code Online (Sandbox Code Playgroud)

这让我想知道我怎么能这样做?我尝试过以下方法:

./gradlew lint -Xlint:deprecation
Run Code Online (Sandbox Code Playgroud)

但它不起作用.它说:

Problem configuring task :app:lint from command line.
Unknown command-line option '-X'.
Run Code Online (Sandbox Code Playgroud)

那我怎么-Xlint:deprecation能通过gradle 传递到Lint?

android lint gradle

33
推荐指数
1
解决办法
3万
查看次数

MACOSX_DEPLOYMENT_TARGET和-mmacosx-version-min有什么区别?

我经常需要定位比我当前运行的版本更旧的Mac OS X版本.由于我更喜欢​​使用bash shell和Makefile,我不使用Xcode.Apple 明确支持定位较旧的OS X版本,但我一直对通常用于定位旧平台的两个配置步骤的冗余感到困惑:

  1. gcc开始使用--macosx-version-min:

    gcc --mmacosx-version-min=10.6 ....
    
    Run Code Online (Sandbox Code Playgroud)
  2. MACOSX_DEPLOYMENT_TARGET环境变量设置为所需的平台,如

    export MACOSX_DEPLOYMENT_TARGET=10.6
    
    Run Code Online (Sandbox Code Playgroud)

当试图通过搜索找出两者之间的实际差异时,你会得到不同的答案.有些人说他们完全一样,所以只需要使用其中一个.但是,也有声音表明有必要同时执行这两项操作:启动gcc --macosx-version-min 设置环境变量.

这两件事完全一样吗?是否只需要使用其中一个而不是两个?某处有官方文件吗?Apple提到MACOSX_DEPLOYMENT_TARGET但根本没有提及--macosx-version-min,尽管它似乎更常见.

macos gcc backwards-compatibility

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

通过Gradle和Android NDK强制CMake处于详细模式

我正在使用Gradle和CMake从命令行编译Android NDK项目.以前,我使用Ant,ndk-build但我正在尝试将项目完全迁移到Gradle和CMake.

在我,build.gradle我有以下几行来调用CMake:

externalNativeBuild {
    cmake {
        path "src/main/cpp/CMakeLists.txt"
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我怎样才能强制CMake在它出现之前将所有编译器调用打印到控制台?具体来说,我想看看CMake如何运行编译器和链接器.

我已经尝试了以下,但都无济于事:

1)在我,CMakeLists.txt我已经把以下行:

set(CMAKE_VERBOSE_MAKEFILE on)
Run Code Online (Sandbox Code Playgroud)

没有任何影响.

2)我已经开始构建这样的:

./gradlew build --info
Run Code Online (Sandbox Code Playgroud)

Gradle打印了一些东西,但没有编译器调用.

3)并且像这样:

./gradlew build --debug
Run Code Online (Sandbox Code Playgroud)

Gradle打印了很多东西,但是没有编译器调用.

所以这三次尝试都没有做到我想要的东西让我想知道我怎么能看到CMake如何在我的个人源文件上运行?

cmake gradle android-ndk

14
推荐指数
1
解决办法
6892
查看次数

使用WS_OVERLAPPED,AdjustWindowRectEx()和GetWindowRect()给出错误的大小

我想在打开窗口之前计算窗口的完整大小.我正在使用AdjustWindowRectEx()来实现这一目标.对于客户端大小为640x480的窗口,我的代码看起来像这样:

    wrect.left = 0;
    wrect.top = 0;
    wrect.right = 640;
    wrect.bottom = 480;
    AdjustWindowRectEx(&wrect, WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, FALSE, 0);
Run Code Online (Sandbox Code Playgroud)

这将返回以下值:

    left: -3
    top: -22
    right: 643
    bottom: 483
Run Code Online (Sandbox Code Playgroud)

但是,当使用CreateWindowEx()打开窗口并传递时

    wrect.right - wrect.left
    wrect.bottom - wrect.top
Run Code Online (Sandbox Code Playgroud)

作为窗口大小,窗口的大小物理大小实际上是656x515像素.仍然,GetWindowRect()返回646x505,即与AdjustWindowRectEx()返回的尺寸相同,但正如我所说,当我拍摄桌面的屏幕截图并使用绘图程序测量窗口的大小时,其物理尺寸实际为656x515像素.有人对此有解释吗?

客户端大小没问题,它是640x480,但看起来边框大小计算错误,因为边框使用的像素数多于AdjustWindowRectEx()和GetWindowRect()计算的像素数.

我在Windows 7上.

编辑:

这是因为问题的标题是误导性的吗?如MSDN autodocs中所述,AdjustWindowRectEx()不支持WS_OVERLAPPED.那么有没有其他方法来计算WS_OVERLAPPED窗口的尺寸?使用WS_OVERLAPPEDWINDOW不是解决方案,因为它设置了我不想要的WS_THICKFRAME和WS_MAXIMIZEBOX.

现在有一些测试代码显示了问题.您可以看到客户端大小正常,但窗口的物理大小大于GetWindowRect()返回的大小.

#include <stdio.h>

#include <windows.h>

#define CLASSNAME "Test"

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{  
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wcx;
    RECT wrect; …
Run Code Online (Sandbox Code Playgroud)

winapi

10
推荐指数
2
解决办法
4899
查看次数

用户评论未显示在Google Play上

几天前我在Google Play上发布了一款应用.当我登录Google Play开发者控制台时,我可以看到有关我的应用的用户评论.但是,当我在Google Play上访问我的应用网站时,这些评论不可见.

有谁知道我如何才能在Google Play上的应用网站上看到这些评论?

android google-play

9
推荐指数
2
解决办法
7414
查看次数

Win32剪贴板和alpha通道图像

我的应用程序应该能够将32位图像(RGB + alpha通道)复制到剪贴板并从剪贴板粘贴这些图像.为此我打算使用,CF_DIBV5因为BITMAPV5HEADER结构有一个字段bV5AlphaMask.

问题是,对于图像数据应该如何存储在剪贴板中似乎没有达成共识.在进行一些测试时,我发现应用程序之间存在一些差异,使得它几乎无法提出通用解决方案.

以下是我的观察:

  1. 当我将Alpha 2010通道图像从Word 2010或XnView复制到剪贴板时,它将被存储而不会预乘像素数据.

  2. 但是,当我使用Firefox或Chrome复制图像时,像素数据似乎被alpha通道预乘.

  3. Firefox设置bV5AlphaMask为0xff000000,而大多数其他应用程序根本不设置它,但保留0.这很奇怪,因为这些应用程序将DIB放到剪贴板上,实际上包含最高8位的alpha通道但仍然设置bV5AlphaMask为0.必须假设如果位深度为32,即使bV5AlphaMask为0 ,也存在alpha通道.

简而言之,我的基本问题是:是否有关于如何将Alpha通道数据存储在剪贴板上的官方信息?我特别想知道数据是否必须预乘.正如您在上面所看到的,Word 2010和XnView不会预先相互映射,而Firefox和Chrome则可以.但是,知道颜色通道是否应该预乘是至关重要的.

非常感谢您对此有所了解!

更新2 粘贴到Paint.NET现在工作正常.它是由我的代码中的一个错误引起的,如果alpha通道为0,则没有将颜色通道设置为0,即在这种情况下前导相应没有正确完成,这似乎混淆了Paint.NET.

仍未解决的问题是Internet Explorer 10.当将带有alpha通道的PNG复制到剪贴板时,IE 10只是将24位CF_DIBV5放在剪贴板上,但Paint.NET可以将此位图粘贴到alpha通道,因此必须有另一种格式IE 10暴露给剪贴板.也许它暴露了PNG使用CFSTR_FILECONTENTS和CFSTR_FILEDESCRIPTOR.

更新 我现在已经按照下面arx描述的方式实现了它,它运行得很好.然而,仍然有两件事令我困惑:

1)将我的应用程序中的alpha通道图像粘贴到Paint.NET中不会保留alpha通道.Paint.NET中的图像看起来不透明.但是,从Firefox和Chrome粘贴到Paint.NET完美地运行,alpha通道被保留了!我已经抛弃了完整的DIBV5并且它与我的应用程序完全相同,但它仍适用于FF和Chrome,但不适用于我的应用程序,因此必须有其他内容!Firefox和Chrome必须做一些我的应用不做的事情!?

2)对于Internet Explorer 10也是如此.将IE 10中的Alpha通道图像粘贴到我的应用程序根本不起作用...我得到的深度为24的DIB,即没有alpha通道所有.然而,当从IE 10粘贴到Paint.NET时,alpha通道就在那里!所以这里必须有更多东西......

c windows winapi 2d

9
推荐指数
1
解决办法
2928
查看次数

table.unpack()只返回第一个元素

有人可以向我解释为什么table.unpack()只有在函数调用中使用了第一个表元素之后才返回第一个表元素table.unpack()

这是一些演示代码:

local a = {1,2,3,4,5}
print("Test", table.unpack(a))   -- prints "Test 1 2 3 4 5"
print(table.unpack(a), "Test")   -- prints "1 Test"
Run Code Online (Sandbox Code Playgroud)

我不明白为什么第二行只是打印1 Test.我希望它能打印出来1 2 3 4 5 Test.有人可以解释这种行为吗?我也对如何打印第二次打印感兴趣1 2 3 4 5 Test.

lua lua-table

9
推荐指数
1
解决办法
4229
查看次数

添加到固定长度数组指针时行为是否未定义,从而导致溢出?

看一下以下代码,取自旧版本的 ffmpeg:

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

struct foo
{
    int16_t (*ac_val_base)[16];
    int16_t (*ac_val[3])[16];
};

int main(int argc, char *argv[])
{
    struct foo bar;
    int16_t *ac_val, *ac_val1;

    bar.ac_val_base = malloc(4639 * 16 * sizeof(int16_t));
    bar.ac_val[0] = bar.ac_val_base + 66;

    ac_val = bar.ac_val[0][0] + 3780 * 16;
    ac_val1 = ac_val;
    
    printf("Result: %d\n", (int) (((char *) ac_val1) - ((char *) bar.ac_val[0][0])));

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

当使用 gcc 或 Visual C 等已建立的编译器对其进行编译时,结果是 120960。这对我来说很有意义,因为我要添加3780 * 16int16_t数组指针,因此我希望生成的指针比源指针高 120960 字节。

然而,当使用 vbcc …

c

9
推荐指数
1
解决办法
207
查看次数