小编urz*_*eit的帖子

如果在参数列表中使用了另一个typedef类型的名称,则发出警告

考虑一个大型项目,其中有许多类型typedef,例如

typedef int age;
typedef int height;
Run Code Online (Sandbox Code Playgroud)

和一些函数获取这些类型的参数:

void printPerson(age a, height h) {
    printf("Age %d, Height %d\n", a, h);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在编译时警告,如果这些参数是错误的类型,例如

age a = 30;
height h = 180;
printPerson(h, a); /* No warning, because a and h are both integers */
Run Code Online (Sandbox Code Playgroud)

在这种情况下,gcc(或某些静态代码分析工具)是否有选项可以发出警告?

c gcc

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

perl常量在哪里被它们的值替换?

我试图use constant在perl中使用值并偶然发现以下奇怪的行为:

#!/usr/bin/perl
use strict;
use warnings;

use Data::Dumper;

use constant {
    a => "b"
};

my $c = { a => a };
my %d;
$d{a} = a;

print Dumper($c);
print Dumper(\%d);
Run Code Online (Sandbox Code Playgroud)

将输出

$VAR1 = {
          'a' => 'b'
        };
$VAR1 = {
          'a' => 'b'
        };
Run Code Online (Sandbox Code Playgroud)

常量a被替换的表达式的右侧$d{a} = aa => a左侧,但不是.

我知道常量是使用inlinable subs(这里记录)来实现的,并且子名称如果它们不是预先声明的(这里记录),则评估它们的名称,但我看不出为什么在我的例子中为什么a评估一次值和一次到同一行代码中的名称,特别是在散列的赋值中 - 如果以字母开头,则a => a可能是=>将左侧站点解释为字符串的结果.

旁注:添加parantheses以使子调用显式生成预期结果:

# ... …
Run Code Online (Sandbox Code Playgroud)

perl constants

8
推荐指数
1
解决办法
181
查看次数

如何确定双重的最小显着变化

我有问题确定eps给定的双变量的最小值,v这样

v+eps != v
Run Code Online (Sandbox Code Playgroud)

请注意,这不是典型的问题表任务,因为它eps取决于任意数字v.

这不应该通过在for循环中寻找这个值来完成.有没有快速的方法来做到这一点,例如通过位移?独立于编译器,优化标志,平台......

谢谢你的回答

floating-point

7
推荐指数
1
解决办法
153
查看次数

将C++接口中的longjmps隐藏到C代码中

为旧C代码生成C++ API的正确方法是什么?该代码广泛使用带有多个跳转目标的longjmp进行错误管理?

我的想法是编写一个函数来为每个使用过的目标设置跳转目标,例如:

void catchJumps() {
    if (setjmp(target1)) throw Error1(); //Error1 and Error2 are some exception classes
    if (setjmp(target2)) throw Error2();
    //...
}
Run Code Online (Sandbox Code Playgroud)

然后我会调用catchJumps每个使用C代码的C++函数(在每个范围内,更具体):

int some_wrapper() {
    catchJumps();
    callCFunction()

    for (int i = 0; i < 1000; i++) {
        catchJumps();
        callOtherCFunction();
    }

    catchJumps();
    callOneMoreCFunction();
    callEvenOneMoreCFunction();
}
Run Code Online (Sandbox Code Playgroud)

这是一种在不破坏堆栈的情况下捕获所有longjump的安全方法吗?我知道,longjmp进入不同的堆栈框架是危险的.现在我的函数catchJumps在另一个堆栈框架而不是调用some_wrapper.我希望(或者我甚至可以做到)catchJumps可以内联,所以框架是相同的,但我不知道.

对于要调用的作用域对象的所有析构函数,每个作用域中的调用(以及上面的循环之后)都是必需的,对吧?

如果这不是将longjmps"转换"为调用应用程序的断言的有效方法,那么我们还能做些什么呢?

c c++ api longjmp

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

一步杀死并等待

如果我使用组合来批量杀死子进程并等待它终止,我使用

kill $PID
wait $PID
Run Code Online (Sandbox Code Playgroud)

如果该进程立即存在,则该进程wait将失败,因为 pid 不再运行。

有没有办法将两个语句组合成一个语句来避免错误?

编辑:我必须杀死的进程使用临时文件;因此它必须关闭(而不仅仅是发出关闭信号)才能再次启动它。检查 的返回值kill无济于事,因为这表明信号是否已成功传递。

linux bash kill waitpid

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

检查 unsigned long long 是否可用

如何通过预处理器指令检查该类型unsigned long long在当前构建环境中是否可用?

我尝试检查

#if __STDC_VERSION__ >= 199901L
    /* Available */
#else
    /* Not available */
#endif
Run Code Online (Sandbox Code Playgroud)

但是用 gcc 编译并且至少没有-std=-compiler 参数这会导致“不可用”(但可以工作)。

是否有更好的宏来检查,以便至少它可以与 C99 标准编译器一起工作,并且可以在没有 的情况下与 GCC 一起工作-std=C99

c unsigned-long-long-int c-preprocessor

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

让宏计算其调用

我有一个庞大的C项目,其中包含模块读取和管理配置数据.如果我必须添加一个新的配置参数,我将不得不编辑几个函数,例如伪代码:

void read_configuration(config *c) {
    read_param("p1", c->p1);
    read_param("p2", c->p2);
    read_param("p3", c->p3);
    /* ... */
}

void dump_configuration(config *c) {
    dump_param("p1", c->p1);
    dump_param("p2", c->p2);
    dump_param("p3", c->p3);
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在编译时通过宏确保每个位置至少具有相同的参数计数?我想过制作dump_param某种宏来计算调用,然后添加类似的东西

#if nr_read != nr_dump
    #error "You forgot something, idiot!"
#endif
Run Code Online (Sandbox Code Playgroud)

在模块的最后.我找不到一种让宏计算其调用的方法,尽管......

c macros c-preprocessor

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

我可以在构造函数中使用setter吗?

我要用一个相当复杂的设置过程构建一个时间跨度类.将有几个构造函数.在构造函数中调用setter是一个坏主意吗?

我知道如果在派生类中覆盖setter,我不应该直接调用非私有的setter来避免问题.我想到要么创建真正的setter private并包装公共setter并在构造函数中调用私有setter以避免必须声明它是final.

class A {
    public:
         A(sometype data1, sometype data2);

         void setData1(sometype data1);
         void setData2(sometype data2);

    private:
         void p_setData1(sometype data1);
         void p_setData2(sometype data2);
};

A::A(sometype data1, sometype data2) {
    p_setData1(data1);
    p_setData2(data2);
}

void A::setData1(sometype data1) { p_setData1(data1); }
void A::setData2(sometype data2) { p_setData2(data2); }

void A::p_setData1(sometype data1) {
     //Complex validation and calculations
}

void A::p_setData2(sometype data2) {
     //Complex validation and calculations
}
Run Code Online (Sandbox Code Playgroud)

有没有人有最好的做法?

c++ setter constructor

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

将0字节转换为NULL指针是否安全?

在我的环境中,以下代码运行正常,但它是否可以保证好?

FILE *file = fopen("in", "r");
int *read_to = NULL;
size_t count = 0;
size_t read = fread(read_to, sizeof(*read_to), count, file);
fclose(file);
Run Code Online (Sandbox Code Playgroud)

分别

FILE *file = fopen("out", "w");
int *write = NULL;
size_t count = 0;
size_t written = fwrite(write, sizeof(*write), count, file);
fclose(file);
Run Code Online (Sandbox Code Playgroud)

c null fread language-lawyer

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

如何使用PHP重启linux系统(Debian)

我想用PHP执行linux命令

myfile.php:

<?php
$output = shell_exec('ls');
echo "<pre>$output</pre>";
?>
Run Code Online (Sandbox Code Playgroud)

有用!

但是当我将linux命令ls改为时reboot,没有任何反应!

所以我试图找到另一个解决方案:

mycode.html:

<button type="button" onclick="/var/www/myscript.sh">Click Me!</button>
Run Code Online (Sandbox Code Playgroud)

myscript.sh:

sudo reboot
Run Code Online (Sandbox Code Playgroud)

它也不起作用!

愿任何人帮我解决这个问题.

谢谢你的帮助.

php linux

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

在64位二进制文​​件上,超过2gb的分配失败

在一台64位的linux机器上,我编写了以下小型C程序:

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

int main (void)
{
    #define BLOCK_SIZE (1024*1024)
    int i;

    for (i = 1; ; i++)
    {
        char *p = (char *)malloc(i * BLOCK_SIZE);
        if (p == 0)
            break;
        *p = 13;
        free(p);
    }

    printf ("Allocated max %d MB\n", (i - 1));

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

如果我编译它-O0 -m64,我可以在我的桌面系统上分配2047 MB​​.如果我使用-O0 -m323829 MB 编译相同的程序.

为什么32位二进制文​​件的最大malloc大小比同一台机器上的64位二进制文​​件大?

编辑:如果我激活优化器-O3,64位机器上的最大内存量为20588.

c linux malloc memory-management

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

声明一个新的长数组c ++

我正确宣布这个吗?

string regular = "TEST";
long[] cipher = new long[regular.length()];
Run Code Online (Sandbox Code Playgroud)

获得此编译错误: expected unqualified-id before '[' token

c++

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