select syscall需要3个filedescriptor集,用于监视fds的可读/可写性以及filedescriptor上的“ exceptions”。
我的选择手册页对exceptfd
描述符集的描述不多。 它是干什么用的; 可以并且会在文件描述符上通知什么样的异常?
我假设这对于描述符类型可以是不同的……无论是TCP套接字,管道,tty等)。 没有人能提供有关select
可以报告各种描述符的错误的更多信息吗?
可以说我有一个数组为:
int a [] = {4,5,7,10,2,3,6}
当我访问a [3]之类的元素时,它实际上在幕后发生了什么?为什么许多算法书籍(例如Cormen书籍...)都说它需要固定的时间?
(我只是低级编程的新手,所以我想向你们学习更多)
我有一个共享库,希望将其链接为使用GCC的可执行文件。 共享库具有非标准名称,其格式不是libNAME.so,因此我不能使用通常的-l选项。 (它碰巧也是Python扩展,因此没有“ lib”前缀。)
我能够将库文件的路径直接传递给链接命令行,但这会导致库路径被硬编码到可执行文件中。
例如:
g++ -o build/bin/myapp build/bin/_mylib.so
有没有一种方法可以链接到该库而不会导致路径被硬编码到可执行文件中?
我需要的是可以输入数字的东西,它将返回最高位。 我敢肯定有一个简单的方法。 下面是一个示例输出(左边是输入)
1 -> 1 2 -> 2 3 -> 2 4 -> 4 5 -> 4 6 -> 4 7 -> 4 8 -> 8 9 -> 8 ... 63 -> 32
在C语言中,有没有一种很好的方法来跟踪枚举中元素的数量? 我见过
enum blah {
FIRST,
SECOND,
THIRD,
LAST
};
但这仅在项目是连续的且从零开始时才有效。
例如,假设我在不同的项目中有两个等效的结构a
和#pragma pack
:
typedef struct _a
{
int a;
double b;
char c;
} a;
typedef struct _b
{
int d;
double e;
char f;
} b;
假设我没有使用任何指令,例如#pragma pack
,并且这些结构是在同一体系结构的同一编译器上编译的,它们在变量之间是否具有相同的填充?
我想自我教育的目的是为动态语言实现一个简单的虚拟机,更喜欢用C语言。类似Lua VM,Parrot或Python VM的东西,但是更简单。 除了查看现有VM的代码和设计文档以外,是否有任何良好的资源/教程来实现这一目标?
编辑:为什么要近距离投票? 我不明白-这是不是编程。 如果我的问题有特定问题,请发表评论。
(注意:这是一个语言律师问题;我不是在指任何特定的现有编译器。)
什么时候允许编译器降低程序的时间复杂度?
在什么情况下(如果有)将其视为“可观察到的行为”,为什么?
(例如,编译器可以合法地将多项式时间程序“简化”为指数时间程序吗?)
如果答案在C和C ++或两者的不同版本中有所不同,请说明不同之处。
在x86_64 linux上使用gcc和ld,我需要链接到库的较新版本(glibc 2.14),但是可执行文件需要在具有较旧版本(2.5)的系统上运行。 由于唯一不兼容的符号是memcpy(需要memcpy@GLIBC_2.2.5,但是提供memcpy@GLIBC_2.14的库),我想告诉链接器,它应该采用我指定的旧版本,而不是使用memcpy的默认版本。 。
我发现这样做很尴尬:只需在链接器命令行中指定旧.so文件的副本即可。 这可以正常工作,但是我不喜欢将多个.so文件(只能通过指定我链接到的所有旧库才能工作,也有对memcpy的引用)来将其检入svn并由我的构建系统使用的想法 。
因此,我正在寻找一种告诉链接器采用旧版本符号的方法。
对我不起作用的替代方法是:
考虑链接器的所有工作时,似乎很难实现,毕竟它也有一些代码可以找出符号的默认版本。
只要不像编辑所生成的二进制文件那样怪异的技巧,任何其他与简单链接程序命令行具有相同复杂性级别的想法(例如创建简单的链接脚本等)也将受到欢迎。
编辑:为了保护以后的读者,除了以下思想外,我还为链接器找到了--wrap
选项,该选项有时也很有用。
好的,所以我听取了关于此主题的不同意见,只是想确保我正确理解它。
声明f
和f
的意思完全相同,函数va_list
不带任何参数。 同上的定义。
声明f
表示f
不采用任何参数。
声明f
表示函数f
可能带有或不带有参数,如果有,则我们不知道它们是什么类型的参数,或者有多少个参数。 请注意,它与省略号不同,我们不能使用va_list
。
现在,这里变得有趣。
宣言:
void f();
定义:
void f(int a, int b, float c)
{
//...
}
宣言:
void f();
定义:
void f()
{
//...
}
在情况1和2中,当我们调用f
带有正确的参数,错误的参数和根本没有参数时,会在编译时发生什么情况? 在运行时会发生什么?
如果我用参数声明f
,但在没有参数的情况下进行定义,会有所不同吗? 我应该能够处理函数体中的参数吗?
我正在寻找一种可以为不同编译器(gcc,microsoft vc ++,borland等)和不同平台(Win,Linux,Mac)的C / C ++项目生成makefile的工具。
术语“函数的隐式声明”是什么意思? 在不包含适当头文件的情况下,对标准库函数的调用会产生警告,例如:
int main(){
printf("How is this not an error?");
return 0;
}
是否应该在未声明错误的情况下使用函数? 请详细说明。 我搜索了该站点,发现了类似的问题,但找不到明确的答案。 大多数答案都说过有关包含头文件的内容以消除警告,但是我想知道这不是错误。
这个问题已经在这里有了答案:
我是该语言的新手。 假设我有一个来自HTTP请求的字符串,例如
char * request = "GET /favicon.ico HTTP/1.1";
我特别想知道favicon
是否在该请求中,也许带有布尔值。 相对简单的方法是什么? 我知道如何用Java做到这一点,但是我对C更加迷失了。
谢谢!
以下C ++代码是什么意思?
unsigned char a : 1;
unsigned char b : 7;
我猜它创建了两个字符a和b,它们都应该是一个字节长,但是我不知道“:1”和“:7”部分的作用。
如何从头开始用C创建Hashmap?将考虑哪些参数,您将如何测试哈希图的优劣? 就像在说哈希映射完成之前需要运行的基准测试用例一样。
由于300448181620519831983仅列出了动态库,是否有一种方法可以提取有关用于创建可执行文件的静态库的信息?
如果多个线程在同一FILE*
变量上同时调用fflush()
,会发生什么不好的事情(例如未定义的行为,文件损坏等)?
澄清:我并不是说要同时写入文件。 我的意思是同时刷新它。
线程不会同时读取或写入文件(它们只能在关键部分内写入文件,一次只能写入一个线程)。 它们仅刷新到关键部分之外,以便更快地释放关键部分,以便让其他人执行其他工作(文件写入除外)。
尽管可能发生一个线程正在写入文件(在关键部分内),而另一个线程正在刷新文件(在关键部分外)。
标题说明了一切。 main()
函数对于C程序是否绝对必要?
我之所以这样问是因为我正在查看Linux内核代码,但是没有看到main()函数。
我使用sizeof来获取C语言中一个结构的大小,但是得到的结果是意外的。
struct sdshdr {
int len;
int free;
char buf[];
};
int main(){
printf("struct len:%d\n",(sizeof(struct sdshdr)));
return 0;
} //struct len:8, with or without buf
我的问题是为什么gcc -v
不占用任何空间,为什么在64位CPU上int
类型的大小仍为4?
这是gcc -v
的输出:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.4.0
Thread model: posix
#include<stdio.h>
void print(int *arr[], int s1, int s2) {
int i, j;
for(i = 0; i<s1; i++)
for(j = 0; j<s2; j++)
printf("%d, ", *((arr+i)+j));
}
int main() {
int a[4][4] = {{0}};
print(a,4,4);
}
这适用于C语言,但不适用于C ++语言。
错误:
cannot convert `int (*)[4]' to `int**' for argument `1' to
`void print(int**, int, int)'
为什么在C ++中不起作用? 需要进行哪些更改?