Tag: gcc

转发申报文件*

如何在C中转发声明FILE * ? 我通常使用struct MyType;执行此操作struct MyType; ,但自然这似乎不可能。 如果C标准或编译器与C ++之间的行为不同,这也是有意义的。 Update0 为什么我要把这个放在一边:我要问的是如何转发声明一个非结构/“typedef’d结构”类型,以便我可以声明指向它的指针。 显然使用void *并将其转换为源文件有点hackish。

哪个初始化程序适用于int64_t?

我喜欢将我的变量初始化为一些“虚拟”值,并开始使用int64_t和uint64_t 。 到目前为止,看起来至少有三种方法可以将int64_t初始化为特定值(并且对于无符号的等价物稍有更改): int64_t method_one = 0; int64_t method_two = 0LL; int64_t method_three = INT64_C(0); 我使用GCC并针对OS X和Linux。 我想选择一种旨在简化便携性和清晰度的方法 – 但最重要的是正确性。 我是否过度思考这个,或者是否有一个“最佳”或“最推荐”的方法来初始化这个变量类型,对于我抛出的任何特定值(当然,它在其范围内)?

Mac解决方案“安全”替代“不安全”的C / C ++标准库函数?

什么是Mac上最好的一站式“安全”C库解决方案? 我在“安全”/“不安全”上使用引号,因为关于某些标准库函数或其推定改进的替代方案的好处存在很多争议。 由于可能存在缓冲区溢出或其他安全问题,许多传统的标准C库函数(例如, vfprintf )被认为是不安全的。 在Windows上,Microsoft C / C ++编译器提供 “_s”函数(例如, vfprintf_s )作为标准库调用的更安全的替代方法。 这些function不是直接替换,因为它们具有提供附加安全信息(例如,缓冲区长度)所必需的不同签名。 它们还提供其他function,例如无效的格式字符串检测,不同的文件安全性等。据我所知,这种实现在Mac上不可用。 Apple(或第三方)是否在OSX上提供与GCC类似的任何内容? 特别是,我正在寻找至少以下function的“安全”实现: fopen vfprintf vsprintf sprintf strncpy strcpy strcat 请注意:这个问题与Mac有关。 我不是在征求你对微软实施的看法(除非它在Mac上可用。)虽然其中一些function可能很容易自己编写,但并非所有function都可以。 我不是在问自己如何写这些。 我不是要求有关如何使用STL类来做到这一点的提示。 我不是在问如何关闭警告。 我的特殊需求非常具体。 我正在尝试确定最佳实践Mac API,它与传统的C库调用尽可能相似,同时增加了安全性。 当然,在Mac和Windows(以及其他操作系统)上运行的便携式实现会更好。

GCC的NetBeans设置

当我点击项目属性时,我可以设置Warning level ( More Warnings )和Command Line -> Additional Options ( -std=c99 )。 但我希望我的所有C项目默认都有这种选项,而不是每次创建新项目时都手动设置它们。

GCC:-O3和-Os之间的差异

我对GCC -O3标志非常熟悉,但是它与-Os有什么不同,在哪种情况下我们应该优先选择其他?

在C中分配128位整数

当我尝试在gcc 4.9.1中分配一个128位整数时,我收到一个warning: integer constant is too large for its type 。 示例代码 int main(void) { __uint128_t p = 47942806932686753431; return 0; } 产量 我正在使用gcc -std=c11 -o test test.c编译,我得到: test.c: In function ‘main’: test.c:2:19: warning: integer constant is too large for its type __uint128_t p = 47942806932686753431; ^ 我做错了什么或者这是gcc中的错误?

如何在GCC内联汇编中使用标签?

我正在尝试学习x86-64内联汇编并决定实现这个非常简单的交换方法,只需按升序排序a和b : #include void swap(int* a, int* b) { asm(“.intel_syntax noprefix”); asm(“mov eax, DWORD PTR [rdi]”); asm(“mov ebx, DWORD PTR [rsi]”); asm(“cmp eax, ebx”); asm(“jle .L1”); asm(“mov DWORD PTR [rdi], ebx”); asm(“mov DWORD PTR [rsi], eax”); asm(“.L1:”); asm(“.att_syntax noprefix”); } int main() { int input[3]; scanf(“%d%d%d”, &input[0], &input[1], &input[2]); swap(&input[0], &input[1]); swap(&input[1], &input[2]); swap(&input[0], &input[1]); […]

使用gcc编译多个C文件

我有两个文件, main.o和modules.o ,我正在尝试编译它们,以便main.o可以调用modules.o函数。 我被明确告知不要尝试#include module.o 。 我真的不知道我应该做什么。 我尝试了几个不同版本的gcc (例如gcc -xc driver main.o modules.o ),但我没有得到任何工作:编译器不断返回 error: called object is not a function .o文件是我的源代码文件(我被指示将我的源代码放在扩展名为.o文件中。)我该怎么做才能编译它?

有没有办法在gcc <4.4上做128位整数

gcc 4.4似乎是在他们添加int128_t我需要使用位移,而且我已经用完一些位字段了。 编辑 :可能是因为我在32位计算机上,没有办法让它用于32位计算机(Intel Atom),是吗? 我不在乎它是否会产生棘手的慢速机器代码,如果我按照预期的工作位移。

在C中为什么你需要一个goto标签后的声明?

我正在编写一些C代码,在我的代码中我有两个嵌套循环。 在特定条件下,我想要break内循环并continue外循环。 我尝试使用外部循环代码末尾的标签来实现这一点,并在条件下goto该标签。 但是gcc给出的错误是我在复合语句的末尾没有标签。 为什么不? 注1:这不是一个switch语句, 这个问题已在其他地方得到解答。 注2:这不是关于样式的问题,而是我应该或不应该使用goto语句或条件变量。 编辑:人们已经要求一个例子,我可以给出一个轻微的例子,检查一个数组是否是另一个数组的子数组 int superArray[SUPER_SIZE] = {…}, subArray[SUB_SIZE] = {…}; int superIndex, subIndex; for (superIndex=0; superIndex<SUPER_SIZE-SUB_SIZE; superIndex+=1) { for (subIndex=0; subIndex<SUB_SIZE; subIndex+=1) if (superArray[superIndex+subIndex] != subArray[subIndex]) goto break_then_continue; // code that executes if subArray is a sub array break_then_continue: }