考虑一个大型项目,其中有许多类型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(或某些静态代码分析工具)是否有选项可以发出警告?
我试图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} = a和a => a左侧,但不是.
我知道常量是使用inlinable subs(这里记录)来实现的,并且子名称如果它们不是预先声明的(这里记录),则评估它们的名称,但我看不出为什么在我的例子中为什么a评估一次值和一次到同一行代码中的名称,特别是在散列的赋值中 - 如果以字母开头,则a => a可能是=>将左侧站点解释为字符串的结果.
旁注:添加parantheses以使子调用显式生成预期结果:
# ... …Run Code Online (Sandbox Code Playgroud) 我有问题确定eps给定的双变量的最小值,v这样
v+eps != v
Run Code Online (Sandbox Code Playgroud)
请注意,这不是典型的问题表任务,因为它eps取决于任意数字v.
这不应该通过在for循环中寻找这个值来完成.有没有快速的方法来做到这一点,例如通过位移?独立于编译器,优化标志,平台......
谢谢你的回答
为旧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"转换"为调用应用程序的断言的有效方法,那么我们还能做些什么呢?
如果我使用组合来批量杀死子进程并等待它终止,我使用
kill $PID
wait $PID
Run Code Online (Sandbox Code Playgroud)
如果该进程立即存在,则该进程wait将失败,因为 pid 不再运行。
有没有办法将两个语句组合成一个语句来避免错误?
编辑:我必须杀死的进程使用临时文件;因此它必须关闭(而不仅仅是发出关闭信号)才能再次启动它。检查 的返回值kill无济于事,因为这表明信号是否已成功传递。
如何通过预处理器指令检查该类型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项目,其中包含模块读取和管理配置数据.如果我必须添加一个新的配置参数,我将不得不编辑几个函数,例如伪代码:
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)
在模块的最后.我找不到一种让宏计算其调用的方法,尽管......
我要用一个相当复杂的设置过程构建一个时间跨度类.将有几个构造函数.在构造函数中调用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)
有没有人有最好的做法?
在我的环境中,以下代码运行正常,但它是否可以保证好?
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) 我想用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)
它也不起作用!
愿任何人帮我解决这个问题.
谢谢你的帮助.
在一台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.
我正确宣布这个吗?
string regular = "TEST";
long[] cipher = new long[regular.length()];
Run Code Online (Sandbox Code Playgroud)
获得此编译错误: expected unqualified-id before '[' token