Tag: gcc

c中的##是什么?

我看过这个片段: #define kthread_create(threadfn, data, namefmt, arg…) \ kthread_create_on_node(threadfn, data, -1, namefmt, ##arg) ##代表什么? ##出现在宏外时是什么意思?

如何让GCC完全展开这个循环(即剥离这个循环)?

有没有办法指示GCC(版本我使用4.8.4)完全展开底部函数中的while循环,即剥离此循环? 循环的迭代次数在编译时是已知的:58。 我先解释一下我的尝试。 通过检查GAS输出: gcc -fpic -O2 -S GEPDOT.c 使用12个寄存器XMM0 – XMM11。 如果我将标志-funroll-loops传递给gcc: gcc -fpic -O2 -funroll-loops -S GEPDOT.c 循环只展开两次。 我检查了GCC优化选项。 GCC表示-funroll-loops也会打开-frename-registers ,所以当GCC展开一个循环时,它先前选择的寄存器分配是使用“遗留”寄存器。 但是XMM12只剩下4个 – XMM15,所以GCC最多只能展开2次。 如果有48个而不是16个XMM寄存器可用,GCC将毫无困难地展开while循环4次。 然而我做了另一个实验。 我首先手动两次展开while循环,获得一个函数GEPDOT_2。 然后两者之间没有任何区别 gcc -fpic -O2 -S GEPDOT_2.c 和 gcc -fpic -O2 -funroll-loops -S GEPDOT_2.c 由于GEPDOT_2已用完所有寄存器,因此不执行展开。 GCC确实注册了重命名,以避免引入潜在的错误依赖。 但我确信在我的GEPDOT中没有这样的潜力; 即使有,也不重要。 我尝试自己展开循环,展开4次比展开2次更快,比没有展开更快。 当然我可以手动展开更多次,但这很乏味。 GCC可以帮我吗? 谢谢。 // C file “GEPDOT.c” #include […]

未找到libcurl符号

真是愚蠢的C问题。 我正在尝试在这里构建源代码,以便我可以开始为自己修改它 http://curl.haxx.se/libcurl/c/ftpget.html 我下载文件,然后运行 gcc -o test ftpget.c 得到 Undefined symbols: “_curl_global_init”, referenced from: _main in ccFchguB.o “_curl_easy_perform”, referenced from: _main in ccFchguB.o “_curl_easy_setopt”, referenced from: _main in ccFchguB.o _main in ccFchguB.o _main in ccFchguB.o _main in ccFchguB.o “_curl_easy_cleanup”, referenced from: _main in ccFchguB.o “_curl_easy_init”, referenced from: _main in ccFchguB.o “_curl_global_cleanup”, referenced from: _main in […]

在编译时在c / c ++预处理宏中validation参数是ARRAY类型

有没有办法在ac宏的编译时validation参数是一个数组? 例如在这两个宏中: #define CLEAN_ARRAY(arr) \ do { \ bzero(arr, sizeof(arr)); \ } while (0) 和 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 我尝试了一些使用CTC(X)宏的东西,但是找不到任何方法来validation/警告arr是不是一个数组。

-c选项在GCC中做什么

有谁知道-c标志在gcc做了什么? 例如,有什么区别 gcc -c output0.c vs gcc output0.c 我知道第二个创建.a文件,但我不是.a文件。 还有-o做什么 gcc output0.o -o output0 只是将输出文件命名为right?

gcc不再允许空数组吗?

我有gcc 4.7.2-3,我得到以下错误: main.c:5:6:错误:’fname’中缺少数组大小 main.c:6:6:错误:’lname’中缺少数组大小 初始化时: int fname[]; int lname[]; 使用更高版本的gcc不再可能吗? 因为我确定我以前用过这个…… 编辑:我说我记得这个的原因是因为我甚至在这里看到它: http : //h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V40F_HTML/AQTLTBTE/DOCU_046.HTM

防止gcc删除未使用的变量

在我们的源文件中,我们通常有一个类似的版本字符串: static const char srcvers[] = “VERSION/foo.c/1.01/09.04.15”; 当该字符串未被优化时,它在某些情况下非常有用,因为可以通过简单地调用strings a.out | grep VERSION来确定链接到可执行文件的每个源文件的版本。 strings a.out | grep VERSION 。 不幸的是,它被 gcc优化(使用’-O’)。 所以我的问题是,是否有一种简单的方法(编译器开关会很棒)使gcc保持该变量(其名称始终相同)而不关闭任何其他优化。 编辑 在我看来,什么使问题与那个问题不同,是我希望找到一个解决方案,我不必触及成千上万的源文件。

有没有办法让GCC / Clang知道C中的inheritance?

我正在编写一个C库,它使用一些简单的面向对象的inheritance,如下所示: struct Base { int x; }; struct Derived { struct Base base; int y; }; 现在我想将Derived *传递给一个带有Base *的函数: int getx(struct Base *arg) { return arg->x; }; int main() { struct Derived d; return getx(&d); }; 这是有效的,当然是类型安全的,但编译器不知道这一点。 有没有办法告诉编译器这是类型安全的? 我只关注GCC并在这里铿锵作响,因此欢迎编译器特定的答案。 我有一些模糊的记忆,看到一些代码使用__attribute__((inherits(Base))或类似的东西,但我的记忆可能在撒谎。

零大小的结构

我注意到当使用GCC编译时, sizeof(Foo)为0且sizeof(Bar)为1.由于某种原因,将空数组添加到空结构中使其大小为0.我认为两个结构的大小必须相同。 这里发生了什么? struct Foo { char x[]; }; struct Bar {};

GCC,链接库,找不到?

操作系统:Windows 7 Pro X64 IDE:面向C / C ++开发人员的Eclipse IDE 编译器:MinGW(最新,4.5.2) 编译HelloWorld.c有效; 但是当我尝试添加一些外部库时,它会窒息。 我将.a和.dll文件添加到我的’Libraries’中; 将两者的路径添加到PATH和库路径。 我还放了包含文件并配置了Include。 据说我拥有的图书馆与win / mingw兼容。 他们也为MSVC提供了不同的下载function。 令人沮丧。 ld.exe提供完整路径,显然在那里,我有权读/写它们。 我也没有路径包含它们(它们在库路径和路径中)。 我不明白为什么这不起作用。 c:/ mingw / bin /../ lib / gcc / mingw32 / 4.5.2 /../../../../ mingw32 / bin / ld.exe:找不到-lC:\ rhino \ data \ lib \ glfw.dll c:/ mingw / bin /../ lib / […]