Tag: gcc

C中的多字加法

我有一个使用GCC的__uint128_t的C程序很棒,但现在我的需求已经超越了它。 我有196或256位快速算术的选择吗? 我需要的唯一操作是加法(我不需要进位,即,我将使用mod 2 ^ 192或2 ^ 256)。 速度很重要,所以如果可能的话,我不想转向一般的多精度。 (实际上我的代码确实在某些地方使用了多精度,但这是在关键循环中并且将运行数百亿次。到目前为止,多精度需要运行数万次。) 也许这很简单,可以直接编码,或者我需要找到一些合适的库。 你的建议是什么,哦Stack Overflow? 澄清:GMP对我的需求来说太慢了。 虽然我实际上在我的代码中使用了多精度,但它不在内循环中并且运行时间少于10 ^ 5次。 热循环运行更像10 ^ 12次。 当我改变我的代码(增加一个尺寸参数)以使多精度部分比单精度运行更频繁时,我的速度减慢了100倍(主要是由于内存管理问题,我认为,而不是额外的μops)。 我希望将其降低到4倍或更好。

gcc的非空终止字符串编译器选项

更新 原来这只是“c ++不是c布鲁斯”的另一个案例 我想要的是 const char hex[16] = “0123456789ABCDEF”; 唯一有效的 char hex[16] = “0123456789ABCDE”; hex[15] = “F”; 是否有任何编译器选项或我可以做的事情使gc​​c编译器中的字符串不为null终止。 这样我就可以制作一个(n)常数数组

GNU89,混合声明和循环初始声明

GCC和ICC的默认C语言是GNU89。 GNU89允许混合声明,例如 int i; i = 0; int j; 我推断(错误地)来自SO上的一些其他post,例如C:for loop int initial declaration ,这意味着我可以做到 for(int i=0; i<n; i++) 使用GNU89但是当我这样做时,我得到了 error: ‘for’ loop initial declarations are only allowed in C99 mode 显然,混合声明和循环初始声明不是一回事(即一个并不暗示另一个)。 如果我只能有一个,我宁愿有循环初始声明。 当然,我可以使用GNU99,但这不是重点。 默认值是GNU89,它已经破坏了一些C89规则(它还允许BCPL / C ++样式注释)。 是否存在允许混合声明而不是循环初始声明的一些基本原因?

-Wmissing-field-initializer使用指定的初始值设定项时

我正在使用GCC 4.6.2(Mingw)并使用-Wextra编译。 每当我使用指定的初始化程序时,我都会收到奇怪的警告。 对于以下代码 typedef struct { int x; int y; } struct1; typedef struct { int x; int y; } struct2; typedef struct { struct1 s1; struct2 s2[4]; } bug_struct; bug_struct bug_struct1 = { .s1.x = 1, .s1.y = 2, .s2[0].x = 1, .s2[0].y = 2, .s2[1].x = 1, .s2[1].y = 2, .s2[2].x = […]

是否 和(* a)等效为函数参数?

function原型 void foo(int n, int a[][]); 给出了关于不完整类型的错误 void foo(int n, int (*a)[]); 编译。 根据衰减规则int a[][]在这种情况下等效于int (*a)[] ,因此int (*a)[]也应该给出关于不完整类型的错误,但GCC似乎接受它。 有什么我想念的吗? 这可能是一个GCC错误,但我没有发现任何与之相关的内容。

gcc,未初始化的全局变量

有没有办法知道/警告全局变量是否未使用gcc初始化? 我得到了本地/primefaces变量“-Wuninitialized”

为什么GCC在将无符号长整数设置为2 ^ 64-1时发出警告?

C标准规定long int至少为4个字节 – 在我的系统上它是8个字节。 这意味着我可以存储长度为2 ^ 63 -1且unsigned long 2 64 -1的值。 但是,当使用-Wall标志编译以下代码时,它会发出警告[Wimplicitly-unsigned-literal] : int main (int argc, char ** argv) { unsigned long a; a = 18446744073709551615; // 2^64-1 } 如果我改为使用2 63 -1(9223372036854775807),则编译时没有警告(正如预期的那样 – 2 63 -1将适合signed long int )。 对于一个项目,我需要在unsigned long中具有unsigned long ,并且我发现(9223372036854775807 << 1) + 1不会引发此警告。 然后我的老师建议我可以使用limits.h定义的ULONG_MAX ,但没有给出任何警告。 为什么我不能在没有警告声明它被隐式转换的情况下这样做 – 当我明确地声明它时?

带有Quartz的GTK窗口

我正在尝试使用GStreamer SDK的basic-tutorial-5来处理OSX。 SDK从http://gstreamer.freedesktop.org/data/pkg/osx/1.2.4.1/下载 来自http://cgit.freedesktop.org/~slomo/gst-sdk-tutorials/的教程(适用于1.0) 我收到以下错误 basic-tutorial-5.c:5:10: fatal error: ‘gst/video/videooverlay.h’ file not found 我跑的时候 gcc `pkg-config gstreamer-1.0 gtk+-3.0 –cflags –libs` basic-tutorial-5.c -o basic5 任何指针都会有所帮助! 谢谢。 编辑: gst/video/videooverlay.h中有一个gst/video/videooverlay.h /local/frameworks/Gstreamer.framework/Headers 。 pkg-config gstreamer-1.0 gtk+-3.0 –cflags –libs不包括/Library/Frameworks/Gstreamer.framework/Versions/1.0/Headers 感谢@Biffen使用时 gcc `pkg-config –cflags –libs gtk+-3.0` -o basic5 basic-tutorial-5.c -I/Library/Frameworks/Gstreamer.framework/Versions/1.0/Headers -framework GStreamer 还有一点动作: basic-tutorial-5.c:114:17: warning: ‘gtk_button_new_from_stock’ is deprecated [-Wdeprecated-declarations] play_button = gtk_button_new_from_stock […]

关于C函数原型和编译的问题

使用以下代码: int main(){ printf(“%f\n”,multiply(2)); return 0; } float multiply(float n){ return n * 2; } 当我尝试编译时,我得到一个警告:“’%f’期望’double’,但是参数的类型为’int’”和两个错误:“’multiply’的冲突类型”,“先前隐式声明’multiply’是这里。” 问题1 :我猜这是因为,鉴于编译器在第一次碰到它时不知道函数’multiply’,他将发明一个原型,发明原型总是假设’int’都被返回并被视为参数。 因此,本发明的原型将是“int multiply(int)”,因此也就是错误。 它是否正确? 现在,以前的代码甚至都不会编译。 但是,如果我打破两个文件中的代码,如下所示: #file1.c int main(){ printf(“%f\n”,multiply(2)); return 0; } #file2.c float multiply(float n){ return n * 2; } 并执行“gcc file1.c file2.c -o file”它仍然会发出一个警告(printf期望是double但是正在获取int)但是错误将不再显示并且它将被编译。 问题2 :为什么我将代码分成2个文件进行编译? 问题3 :一旦我运行上面的程序(版本分成2个文件),结果就是在屏幕上打印了0.0000。 怎么会? 我猜测编译器再次发明了一个与函数不匹配的原型,但为什么会打印0? 如果我将printf(“%f”)更改为printf(“%d”),它会打印1.再次,对幕后发生的事情的任何解释? 非常感谢提前。

GCC C编译错误,无法忽略void值,因为它应该是

我在编译一些C代码时遇到了麻烦。 当我编译时,我得到这个错误: player.c: In function ‘login’: player.c:54:17: error: void value not ignored as it ought to be 这是错误的代码: static bool login(const char *username, const char *password) { sp_error err = sp_session_login(g_sess, username, password, remember_me); printf(“Signing in…\n”); if (SP_ERROR_OK != err) { printf(“Could not signin\n”); return 0; } return 1; } 有什么方法可以绕过这种错误吗? 谢谢 编辑:所有sp_函数都来自libspotify