Tag: gcc

在OS X 10.7上使用gcc的OpenSSL

我在OS X 10.7上使用TextEdit和gcc来制作小型终端程序。 我正在尝试学习如何编写OpenSSL,但我正在编写剧集(由于已弃用的问题 – 更多内容)。 我已经用Google搜索并搜索了所有内容,但我读到的所有内容都是2011年之前(当问题出现时),特定于iOS(我正在为OS X编程但尝试独立于平台)或谈论使用XCode(我没有 – 我更喜欢TextEdit)。 任何人都可以指出如何使用gcc在OS X上安装OpenSSL程序的简单,一步一步的正确方向? 为了记录,这是我采取的确切步骤: 通过macports安装OpenSSL ‘openssl version’返回“OpenSSL 1.0.1e 2013年2月11日” 我正在尝试编译此文件: http : //saju.net.in/code/misc/openssl_aes.c.txt 我已经改名为’aes.c’而我正在使用’gcc -o aes aes.c’ 我尝试了以下标志(没有结果):-lcrypto,lssl,-Wno-error = deprecated-declarations 我从gcc获得的具体输出如下: Brads-MacBook-Air:Desktop brad$ gcc -o aes aes.c -lssl -lcrypto -Wno-error=deprecated-declarations aes.c: In function ‘aes_init’: aes.c:30: warning: ‘EVP_BytesToKey’ is deprecated (declared at /usr/include/openssl/evp.h:572) aes.c:30: warning: ‘EVP_aes_256_cbc’ is […]

如何让GCC在进行函数调用时警告无数的参数?

我只是调试了一个C程序很长一段时间,却发现我在进行函数调用时错过了一个参数,所以垃圾填充了缺少的参数。 像这样的愚蠢错误确实令人沮丧,但我想编译器应该能够检测到这一点。 (C甚至不支持默认参数;即使在C ++中,也需要显式声明默认参数。) 更新:原型被发现也是错的…… 那么,是否有一个GCC标志用于警告不匹配的函数调用参数号? 我一直都有 – -pedantic和-pedantic ; 令人惊讶的是,这样一个明显的错误未被发现。 (实际上我认为GCC没有报告有一些原因,但我现在想不出来。) 令人尴尬的代码示例: static void dfs(); int main(int argc, const char *argv[]) { dfs(1); } static void dfs(int remain, int last) { // dfs } 我刚才发现的另一个发现是,如果原型包含参数,编译器将报告; 但原型碰巧不包含任何参数,然后编译器就滑倒了。

像宏这样的函数是否需要强制括号? 在参考GCC cpp手册后我很困惑

这让我感到困惑: 要定义类似函数的宏,可以使用相同的’#define’指令,但是在宏名称后面紧跟一对括号。 我相信这是为了让代码脱颖而出,而不是该程序的作者。 像宏名称的其他CAPS规则一样。 但以下是我感到困惑的地方: 类似函数的宏只有在其名称后面带有一对括号时才会展开。 如果你只写这个名字,那就不管它了。 我读完之后立刻就不同意了。 并且gcc -Evalidation了以下代码 #define FUNC display() void display() { printf(“Display\n”); } int main() { FUNC; return 0; } 预处理的输出按预期显示main()函数的内容: int main() { display(); return 0; } 那我在这里错过了什么? 预处理器用于标记源,宏扩展是一个令牌,上面的代码以这种方式处理,预处理器不应该检查任何东西或validation任何东西,它只是转储令牌。 在那种情况下,gcc手册试图传达什么。 我正在学习C编程,所以我可能会经常发生误解,我搜索了一个正确的解释,最后在这里求助。 请帮我解决一下这个。

clrscr()不工作,getch()工作。 为什么?

我正在制作一个小型C程序,它要求输入密钥并在switch语句中执行一些代码。 #include #include int main(int argc, char const *argv[]){ /* code */ printf(“Hello, press a, b or c to continue”); char key = getch(); switch (key){ case ‘a’: clrscr(); //some code break; case ‘b’: //many lines of code break; case ‘c’: clrscr(); //many lines of code break; default: printf(“Ok saliendo\n”); break; } printf(“bye”); } getch()工作正常,但clrscr()不是,即使我包含 […]

堆栈中的变量顺序(GCC)

在GCC中编译C代码时,是否有任何方法可以保证堆栈变量按照我声明的顺序出现在堆栈中(或者按相反的顺序,对我来说无关紧要)? 我知道这可能是通过结构,但我宁愿不使用它们。

ns_initparse的链接器错误

这里的代码 #include #include #include #include #include int main (int argc, char *argv[]) { u_char nsbuf[4096]; char dispbuf[4096]; ns_msg msg; ns_rr rr; int i, j, l; if (argc < 2) { printf ("Usage: %s […]\n”, argv[0]); exit (1); } for (i = 1; i < argc; i++) { l = res_query (argv[i], ns_c_any, ns_t_mx, nsbuf, sizeof […]

使用GCC的其他目录中的静态库和标头

我在这里看看如何使用GCC做静态库,并且解释非常明确(鄙视我必须重写阶乘函数):我有一个函数(fact.c),函数的头部(fact.h) )和main函数(main.c),所有这些都在我的主目录中。 fact.h int fact (int); fact.c int fact (int f) { if ( f == 0 ) return 1; else return (f * fact ( f – 1 )); } main.c中 #include #include “fact.h” int main(int argc, char *argv[]) { printf(“%d\n”, fact(3)); return 0; } 所以我先生成了目标文件(阶段1)…… $ gcc -c fact.c -o fact.o …然后生成静态库(阶段2)…… $ […]

gcc模块大小限制

我在C中创建了一个程序,它将程序作为输出。 目标是测试整体程序中的性能方面。 第一个测试配置了10 000次迭代,结果程序编译并运行。 在Ubuntu 12.04 x86_64中,在具有16 GB RAM(16 GB SWAP)的i7 3770中编译具有100 000次迭代的第二次测试(直到现在为3030分钟)。 我知道解析复杂度从O(n ** 2)到O(n ** 3),但这需要太长时间。 在最糟糕的情况下,编译时间增加1000倍。 消耗35.2%的内存仍然增加。 我的问题是: GCC是否对每个模块或模块大小的变量数量有限制? 这是一个错误吗? 原始程序生成器是: #include #define MAX_INTERACTION 100000 int main(int argc, char **argv) { FILE * fp; fp = fopen(“source.c”,”w”); fprintf(fp,”#include \n \n \n”); fprintf(fp,”int main(int argc, char **argv) \n”); fprintf(fp,”{ \n”); // local variables […]

在C中获取调用函数的名称(不使用预处理器)

我想知道是否有办法在C中找到称为当前函数(在运行时)的函数。 我知道你可以在gcc中使用__FUNCTION__ ,但有没有办法不使用C预处理器? 可能不是。 干杯

程序在接受C中的输入中的第二个字符串之前运行

我试图运行以下代码但程序只接受一个字符串并立即显示输出而不等待输入第二个字符串。 该程序用于2字符串连接。 这是代码: – #include main() { int i, j, len=0; char name[100], abc[100]; printf(“\nPlease Enter String 1 =\t”); scanf(“%[^\n]c”,&name); printf(“\nPlease Enter String 2 =\t”); scanf(“%[^\n]c”,&abc); for(i=0; name[i]!=’\0′; i++) len++; for(j=0; abc[j]!=’\0′; j++) { len++; name[len]=abc[j]; } printf(“\nThe Concatenated String Is =\t”); puts(name); }