Tag: gcc

字符串文字的C优化

刚刚在gdb中检查以下内容: char *a[] = {“one”,”two”,”three”,”four”}; char *b[] = {“one”,”two”,”three”,”four”}; char *c[] = {“two”,”three”,”four”,”five”}; char *d[] = {“one”,”three”,”four”,”six”}; 我得到以下内容: (gdb) pa $17 = {0x80961a4 “one”, 0x80961a8 “two”, 0x80961ac “three”, 0x80961b2 “four”} (gdb) pb $18 = {0x80961a4 “one”, 0x80961a8 “two”, 0x80961ac “three”, 0x80961b2 “four”} (gdb) pc $19 = {0x80961a8 “two”, 0x80961ac “three”, 0x80961b2 “four”, 0x80961b7 “five”} (gdb) […]

从char **隐式转换为const char **

为什么我的编译器(GCC)没有从char**隐式转换为const char** ? 以下代码: #include void print(const char** thing) { std::cout << thing[0] << std::endl; } int main(int argc, char** argv) { print(argv); } 给出以下错误: oi.cpp: In function ‘int main(int, char**)’: oi.cpp:8:12: error: invalid conversion from ‘char**’ to ‘const char**’ [-fpermissive] oi.cpp:3:6: error: initializing argument 1 of ‘void print(const char**)’ [-fpermissive]

如何与GCC进行弱连接工作?

似乎有3种方式告诉GCC弱连接符号: __attribute__((weak_import)) __attribute__((weak)) #pragma weak symbol_name 这些都不适合我: #pragma weak asdf extern void asdf(void) __attribute__((weak_import, weak)); … { if(asdf != NULL) asdf(); } 我总是得到这样的链接错误: 未定义的符号: “_asdf”,引自: _asdf $ non_lazy_ptr在ccFA05kN.o中 ld:找不到符号 collect2:ld返回1退出状态 我在OS X 10.5.5上使用GCC 4.0.1。 我究竟做错了什么?

我应该信任哪个编译器?

这将是一个新手问题,但我试图在C语言(而不是C ++ )的小练习中工作,我遇到了一些问题。 假设我想在一个方法中使用一个数组,该方法的大小取决于其中一个参数: void someFunc(int arSize) { char charArray[arSize]; // DO STUFF … } 当我尝试在Visual Studio 2013中将其编译为.c文件时,我收到一条错误消息,指出不允许使用非常量数组。 但是,相同的代码在GNU编译器下的CodeBlocks中工作。 我应该相信哪一个? 编译器的行为是否正常? 我一直认为,如果你正在做一些编译器不喜欢的事情,你不应该首先做它,因为它不是标准。 任何输入都很有用! 我来自Python背景,我试图更多地参与数据结构和算法的编程。 您可以告诉我的平台是Windows。 如果这个问题需要更多信息才能回答,请告诉我。

如何将64位操作数相乘并获得128位结果?

对于x64,我可以使用这个: { uint64_t hi, lo; // hi,lo = 64bit x 64bit multiply of c[0] and b[0] __asm__(“mulq %3\n\t” : “=d” (hi), “=a” (lo) : “%a” (c[0]), “rm” (b[0]) : “cc” ); a[0] += hi; a[1] += lo; } 但我想以可移植的方式执行相同的计算。 例如,在x86上工作。

通过头文件在GCC中禁用警告消息?

我在我的C代码中使用函数gets() 。 我的代码工作正常,但我收到一条警告信息 (.text+0xe6): warning: the `gets’ function is dangerous and should not be used. 我希望不会弹出此警告消息。 有什么办法吗? 我想知道通过创建一个用于禁用某些警告的头文件可能存在这种可能性。 或者在编译期间有任何选项可以满足我的目的吗? 或者可能有一种特殊的方法使用gets()来发出此警告?

创建静态Mac OS XC构建

如何在Mac OS X上创建.c文件的静态版本? 当我尝试: gcc -o test Main.c -static 我明白了: ld: library not found for -lcrt0.o collect2: ld returned 1 exit status

GCC创建共享对象而不是可执行二进制文件

我有一个正在建设的图书馆。 当我运行以下任何一个时,我的所有对象都会连续编译和链接: ar rcs lib/libryftts.a $^ gcc -shared $^ -o lib/libryftts.so 在我的Makefile中。 我也能够成功地将它们安装到/usr/local/lib当我用nm测试文件时,所有的function都在那里。 我的问题是当我运行gcc testing/test.c -lryftts -o test && file ./test或gcc testing/test.c lib/libryftts.a -o test && file ./test时说: test: ELF 64-bit LSB shared object而不是test: ELF 64-bit LSB executable正如我所料。 我究竟做错了什么?