小编ean*_*mos的帖子

C 中不带参数的函数

    \n
  1. 我知道 \xe2\x80\x9c函数声明符中的空列表不是该函数定义的一部分,指定不提供有关参数数量或类型的信息\xe2\x80\x9e [1]

    \n
    // No information about the parameters is supplied.\nint foo();\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 我知道 \xe2\x80\x9c函数声明符中的空列表是该函数定义的一部分,指定该函数没有参数\xe2\x80\x9e [2]

    \n
    // In this case the foo() function has no parameters.\nint foo()\n{\n    // ...\n}\n
    Run Code Online (Sandbox Code Playgroud)\n
  4. \n
  5. 我知道 \xe2\x80\x9c类型的未命名参数的特殊情况void作为列表中唯一的项目指定该函数没有参数\xe2\x80\x9e [3]

    \n
    // foo() has no parameters.\nint foo(void);\n\n// bar() has no parameters.\nint bar(void)\n{\n    // ...\n};\n
    Run Code Online (Sandbox Code Playgroud)\n
  6. \n
\n

所以这里有一些问题:

\n
    \n
  1. 合法吗int main() { /* ... …

c signature language-lawyer function-prototypes

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

为什么两个相同的指针与 -O1 比较不相等?

#include <stdio.h>

int main(void)
{
    int a, b;
    int *p = &a;

#ifdef __clang__
    int *q = &b + 1;
#elif __GNUC__
    int *q = &b - 1;
#endif

    printf("%p %p %d\n", (void *)p, (void *)q, p == q);
}
Run Code Online (Sandbox Code Playgroud)

C11 § 6.5.9 \ 6 说

两个指针比较相等当且仅当它们都是空指针,都是指向同一个对象的指针(包括指向一个对象的指针和它开头的子对象)或函数,都是指向同一数组最后一个元素之后的指针对象,或者一个是指向一个数组对象末尾的指针,另一个是指向另一个数组对象开头的指针,该对象恰好紧跟地址空间中的第一个数组对象。

我已经通过四种不同的方式对其进行了测试:

  1. Clang 9.0.1 带-01选项;
  2. Clang 9.0.1 没有任何选项;
  3. GCC 9.2.0 带-01选项;
  4. GCC 9.2.9 没有任何选项。

结果如下:

$ ./prog_clang
0x7ffebf0a65d4 0x7ffebf0a65d4 1
$ ./prog_clang_01
0x7ffd9931b9bc 0x7ffd9931b9bc 1
$ ./prog_gcc
0x7ffea055a980 0x7ffea055a980 1 …
Run Code Online (Sandbox Code Playgroud)

c gcc pointers clang language-lawyer

3
推荐指数
2
解决办法
227
查看次数

如何交叉编译Python?

我有一个采用 Cortex A9 ARMv7 架构的 SoC。我需要能够在带有此 SoC 的板上运行 python 脚本。所以我需要针对这个平台交叉编译Python。

SoC具有ARMv7架构,因此我安装了arm-linux-gnueabihf在VirtualBox中运行的Ubuntu 20.04的交叉编译器。

我正在遵循这个指示:

  1. 首先,我下载了Python 2.7.1源代码并将其解压到/home/user/python/Python-2.7.1目录中。

  2. 然后我按照说明下载了补丁。

  3. 然后我应用了补丁:

    patch -p1 < python-2.7.1-cross-compile.patch
    
    Run Code Online (Sandbox Code Playgroud)
  4. 然后我为host编译了一些工具:

    ./configure
    make python Parser/pgen
    mv python hostpython
    mv Parser/pgen Parser/hostpgen
    make distclean
    
    Run Code Online (Sandbox Code Playgroud)
  5. 然后我配置了 Python 进行交叉编译:

    readonly CROSS_COMPILER=arm-linux-gnueabihf
    
    CC=${CROSS_COMPILER}-gcc \
    CXX=${CROSS_COMPILER}-g++ \
    AR=${CROSS_COMPILER}-ar \
    RANLIB=${CROSS_COMPILER}-ranlib \
    ./configure \
    --host=${CROSS_COMPILER} \
    --target=${CROSS_COMPILER} \
    --prefix=/python
    
    Run Code Online (Sandbox Code Playgroud)
  6. 然后我最后交叉编译它:

    make \
    HOSTPYTHON=./hostpython \
    HOSTPGEN=./Parser/hostpgen \
    BLDSHARED="${CROSS_COMPILER}-gcc -shared" \
    CROSS_COMPILE=${CROSS_COMPILER}- \
    CROSS_COMPILE_TARGET=yes
    
    Run Code Online (Sandbox Code Playgroud)

    但最终我得到了IndentationError

    /usr/lib/gcc-cross/arm-linux-gnueabihf/9/../../../../arm-linux-gnueabihf/bin/ld: …
    Run Code Online (Sandbox Code Playgroud)

python linux cross-compiling embedded-linux python-2.7

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

为什么在展开的ADD循环中重新初始化寄存器,即使在循环中包含更多指令的情况下,其运行速度也更快?

我有以下代码:

#include <iostream>
#include <chrono>

#define ITERATIONS "10000"

int main()
{
    /*
    ======================================
    The first case: the MOV is outside the loop.
    ======================================
    */

    auto t1 = std::chrono::high_resolution_clock::now();

    asm("mov $100, %eax\n"
        "mov $200, %ebx\n"
        "mov $" ITERATIONS ", %ecx\n"
        "lp_test_time1:\n"
        "   add %eax, %ebx\n" // 1
        "   add %eax, %ebx\n" // 2
        "   add %eax, %ebx\n" // 3
        "   add %eax, %ebx\n" // 4
        "   add %eax, %ebx\n" // 5
        "loop lp_test_time1\n");

    auto t2 = std::chrono::high_resolution_clock::now();
    auto time = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 …
Run Code Online (Sandbox Code Playgroud)

performance x86 assembly cpu-architecture

2
推荐指数
1
解决办法
64
查看次数