__attribute__((constructor)) 到底是如何工作的?

看起来很清楚它应该设置一些东西。 具体什么时候运行? 为什么有两个括号? 是__attribute__一个函数? 这在 C 中有效吗? 它所使用的函数是否需要是静态的? 什么时候__attribute__((destructor))跑步? Objective-C 中的示例: __attribute__((constructor)) static void initialize_navigationBarImages() { navigationBarImages = [[NSMutableDictionary alloc] init]; } __attribute__((destructor)) static void destroy_navigationBarImages() { [navigationBarImages release]; } 答案 它在加载共享库时运行,通常是在程序启动期间。 所有 GCC 属性都是如此; GCC 特定语法。 是的,这适用于 C 和 C 。 不,该函数不需要是静态的。 析构函数在共享库卸载时运行,通常在程序退出时运行。 因此,构造函数和析构函数的工作方式是共享对象文件包含特殊部分(ELF 上的 .ctors 和 .dtors),其中包含对分别用构造函数和析构函数属性标记的函数的引用。 想想看,普通的静态链接器中可能存在一些类似的魔力,因此无论用户选择静态还是动态链接,在启动/关闭时都会运行相同的代码。 来自: stackoverflow.com

__file__,__line__和__function__

假设您的C ++编译器支持他们,是否有任何特定原因不是 使用__FILE__,,,,__LINE__和__FUNCTION__用于记录和调试目的? 我主要关注的是给用户误导性数据,例如,报告不正确的行号或功能,或结果受到性能命中。 基本上,我可以信任吗__FILE__,,,,__LINE__和__FUNCTION__到总是做正确的事吗? 答案 __FUNCTION__是不标准的,__func__存在于C99 / C ++ 11中。其他 (__LINE__和__FILE__)很好。 它将始终报告正确的文件和行(如果您选择使用的话,并且功能__FUNCTION__/__func__)。优化是一个非因素,因为它是编译时宏扩展。它会never以任何方式影响性能。 来自: stackoverflow.com

_DEBUG 与 NDEBUG

应使用哪个预处理器定义来指定代码的调试部分? 使用#ifdef _DEBUG或者#ifndef NDEBUG或者有更好的方法来做到这一点,例如#define MY_DEBUG? 我认为_DEBUG是 Visual Studio 特定的,NDEBUG 是标准的吗? 答案 Visual Studio 定义_DEBUG当您指定/MTd或者/MDd选项,NDEBUG禁用标准 C 断言。_DEBUG如果你希望你的调试代码与MS CRT 调试技术和NDEBUG如果你想保持一致assert()。 如果您定义自己的调试宏(并且不会破解编译器或 C 运行时),请避免以下划线开头的名称,因为它们是保留的。 来自: stackoverflow.com

_iterator_debug_level 值“0”与值“2”不匹配

我刚刚将 Visual Studio (C ) 解决方案移至另一台计算机,设置了我所看到的所有目录和设置,并对解决方案进行了清理/重建。 答案 您似乎正在混合使用不同设置构建的目标文件。 来自: stackoverflow.com

-STD = C ++ 11和-STD = GNU ++ 11之间有什么区别?

有什么区别-std=c++11和-std=gnu++11作为GCC和Clang的汇编参数?同样的问题c99和gnu99?我知道C ++和C标准,这是我感兴趣的参数的差异。 我已经在某个地方读到它与某些扩展有关,但是我尚不清楚哪些是哪些以及如何在一个或另一个项目之间选择新项目。 答案 正如您发现的那样,这两个选项之间的区别是启用了违反/扩展C ++标准的GNU扩展名是否已启用。描述了GNU C ++扩展这里。您也可以使用大多数GNU C扩展(描述)这里)在您的C ++程序中。阅读有关-WpedanticGCC选项这里。 请注意,使用时仍然有些扩展-std=c++11,只要它们与标准不矛盾。例如,使用MINGW编译器时,我需要工作的扩展名Boost.Lexical_Cast。但是,只要您不使用其中任何一个,就最好坚持使用标准,而无需扩展,以最大程度的便携性。如果您发现自己被迫更换编译器,这可能会派上用场。 来自: stackoverflow.com

.c vs .cc vs. .cpp vs .hpp vs .h vs .cxx

Possible Duplicates: *.h或 *.hpp for您的班级定义 C 代码文件扩展名正确吗? 我曾经以为曾经是这样的: .h文件是C和C ++的标头文件,通常仅包含声明。 .c文件是C源代码。 .cpp文件是C ++源代码(也可以是C源代码)。 然后像文件一样.hpp,,,,.cc, 和.cxx来了,我完全感到困惑…这些区别有什么区别?您什么时候使用"新"? 答案 从历史上看,C ++使用的第一个扩展是.c和.h,与C完全一样,这引起了实际问题,尤其是.c这不允许构建系统轻松区分C ++和C文件。 开发了C ++的Unix具有案例敏感的文件系统。所以有些使用.C对于C ++文件。其他使用.c++,,,,.cc和.cxx。.C和.c++有一个问题是它们在其他文件系统上没有可用,并且使用迅速下降。DOS和Windows C ++编译器倾向于使用.cpp,其中一些使选择很难(即使不是不可能)进行配置。便携性考虑使该选择最常见,即使是MS-Windows之外也是如此。 标题已经使用了相应的.H,,,,.h++,,,,.hh,,,,.hxx和.hpp。.h至今仍是C ++的流行选择,即使缺点,它不允许知道标头是否可以包含在C上下文中。现在,标准标头完全没有扩展。 另外,有些正在使用.ii,,,,.ixx,,,,.ipp,,,,.inl对于提供内联定义的标题和.txx,,,,.tpp和.tpl对于模板定义。这些要么包含在提供定义的标题中,要么在需要的上下文中手动。 编译器和工具通常不在乎使用了哪些扩展名,但是使用它们与C ++关联的扩展程序可防止需要跟踪如何配置它们,从而正确识别使用的语言。 2017编辑:Visual Studio的实验模块支持.ixx作为模块接口的默认扩展名,Clang ++正在识别.c++m,,,,.cppm和.cxxm出于相同的目的。 来自: stackoverflow.com

.cc 和 .cpp 文件后缀有什么区别?

有什么区别.cc和.cpp文件扩展名? 从谷歌上,我了解到它们都是来自C语言,但我不确定它们之间的区别。 答案 惯例。 从历史上看,C 源文件的后缀是.C。 不同的用户采用了不同的解决方案:.cc,.cpp,.cxx可能还有其他。.cpp。 .cc更频繁。 对于标头,情况更加令人困惑:无论出于何种原因,最早的 C 作者决定不区分 C 和 for C 的标头,并使用.h。 如果项目中没有 C,这不会造成任何问题,但是当您开始必须处理这两者时,区分可在 C 中使用的标头通常是一个好主意(.h)和那些不能(.hh或者.hpp)。 此外,在 C 中,许多用户(包括我自己)更喜欢将模板源和内联函数保存在单独的文件中。.inl,.tcc可能还有很多其他的)。 对于标头,它对编译器绝对没有影响。 对于源文件,不同的结尾将导致编译器采用不同的语言。.cc早在 VC 将其识别为 C 之前就与 VC 合作了。 来自: stackoverflow.com

.cpp文件和.h文件有什么区别?

因为我做了.cpp文件然后将它们转移到.h文件,我能找到的唯一区别是你不能#include .cpp文件。我缺少任何区别吗? 答案 C ++构建系统(编译器)没有任何区别,因此这是所有惯例之一。 惯例是.h文件是声明,.cpp文件是定义。 这就是为什么.h文件是#includeD-我们包括声明。 来自: stackoverflow.com

.h 和 .cpp 文件中的默认参数

COMPILER: g 4.7.2 好的。.h和.cpp文件。 test1.h #pragma once #include <iostream> using namespace std; class Class{ public: Class(int, int, int=1); }; test1.cpp #include "test1.h" Class::Class(int a, int b=2, int c) { cout<<a<<" "<<b<<" "<<c<<endl; } int main() { Class a(1); return 0; } 现在,根据我的测试,可以添加默认参数.cpp文件。 默认参数存在于.cpp和.h文件不应重叠。 Class(a, b, c=1)(在 .h 文件中)和Class::Class(a,b,c=2)(在 .cpp 文件中)无效。 众所周知的规则是,一旦添加了默认参数,之后声明的所有变量也必须包含默认值。德帕拉规则。 函数声明中声明的变量(.h文件)应遵守德帕拉 规则,即Class(a, b=2, c)无论 .cpp 文件中声明了什么,(在 .h 文件中)都是无效的。 如果认为变量具有默认值(作为默认值的交集).h和.cpp文件),它将遵循德帕拉 规则。 Class(a, b, c=1)(在 .h 文件中)和Class::Class(a,b=2,c)( 在.cpp文件)有效。Class(a, b, c=1)(在 .h 文件中)和Class::Class(a=2,b,c)( 在....

.h文件应该是什么?

将代码划分为多个文件时,该文件到达.h文件到底应该是什么? 答案 标题文件(.h)旨在提供多个文件中所需的信息。 代码文件(.cpp)旨在提供仅在一个文件中知道的实现信息。通常,功能体和其他模块将永远不会访问的内部变量是属于.cpp文件。一词,“实现”。 最简单的问题要问自己要确定什么属于"如果我更改此内容,我是否必须在其他文件中更改代码才能再次编译?“如果答案是"是”,则可能属于标题文件;如果答案为"否",则可能属于代码文件。 来自: stackoverflow.com

'

Possible Duplicates: While 与 Do While 我什么时候应该使用do-而不是循环? 我已经编程了一段时间(2年工作 + 4。5年 + 1年的预科课程),而且我从未在编程课程中被迫被迫使用过的循环。如果我从来没有遇到如此基本的事情,我越来越感到自己正在做错了编程。 难道我只是没有遇到正确的情况吗? 有哪些示例有必要使用DO-DO-nier而不是一段时间? (我的教育几乎全部都在C/C ++中,我的工作在C#中,因此,如果另一种语言绝对有意义,因为Do-whiles的工作方式有所不同,那么这些问题并不适用)。 澄清…我知道while和do-while。在检查退出条件并执行任务时。do-while执行任务,然后检查退出条件。 答案 如果您始终希望循环至少执行一次。这并不常见,但是我会不时使用它。您可能想使用它的一种情况是尝试访问可能需要重试的资源,例如 do { try to access resource... put up message box with retry option } while (user says retry); 来自: stackoverflow.com

' ' 转义序列有什么用?

我有这样的C代码: #include<stdio.h> int main() { printf("Hey this is my first hello world \r"); return 0; } 我已经用过\r转义序列作为实验。 o world 这是为什么,有什么用\r到底是什么? 如果我在一个在线运行相同的代码编译器得到的输出为: Hey this is my first hello world 为什么在线编译器会产生不同的输出,忽略\r? 答案 \r是一个回车特点; 这光标是渲染下一个字符的位置。 所以,打印一个\r允许覆盖终端仿真器的当前行。 汤姆·齐奇弄清楚为什么你的程序的输出是o world而\r位于该行的末尾,之后您不会打印任何内容: 当程序退出时,shell 会打印命令提示符。o world。 这在线编译器 您提到的只是将原始输出打印到浏览器。\r没有影响。 看https://en.wikipedia.org/wiki/Carriage_return 这是一个使用示例\r: #include <stdio.h> #include <unistd.h> int main() { char chars[] = {'-', '\\', '|', '/'}; unsigned int i; for (i = 0; ; ++i) { printf("%c\r", chars[i % sizeof(chars)]); fflush(stdout); usleep(200000); } return 0; } 它重复打印字符- \ | /在同一位置,给人一种旋转的错觉|在终端中。...

'.' 之前应有主要表达式

#include <iostream> using std::cout; using std::endl; class square { public: double length, width; square(double length, double width); square(); ~square(); double perimeter(); }; double square::perimeter() { return 2*square.length + 2*square.width; } int main() { square sq(4.0, 4.0); cout << sq.perimeter() << endl; return 0; } 我正在尝试编写一个简单的课程程序。我有错误 in member function 'double square::perimeter()'; .cpp:21: error: expected primary-expression before '.' token .cpp:21: error: expected primary-expression before '.' token 这是否意味着我必须使用2*square::length + 2*square::width? 答案 square是一个类型,不是一个对象;代替 return 2*square....

'“ sdl.h”编译时找不到此类文件或目录

这是我当前的 Makefile 的一部分: CFLAGS = -O2 -Wall -pedantic -std=gnu++11 `sdl-config --cflags --libs` -lSDL_mixer 我安装了libsdl,sdl.h在/usr/include/sdl所属的位置,但它不会编译。我也有线条#include "SDL.h"在我的 .h 文件中,但仍然不行。 有人知道为什么吗? 答案 如果头文件是/usr/include/sdl/SDL.h和你的代码有: #include "SDL.h" 您需要修复您的代码: #include "sdl/SDL.h" 或者告诉预处理器在哪里可以找到包含文件: CFLAGS = ... -I/usr/include/sdl ... 来自: stackoverflow.com

'\0' 是什么意思?

我无法理解以下代码中两个不同位置的"\0"的含义: string x = "hhhdef\n"; cout << x << endl; x[3]='\0'; cout << x << endl; cout<<"hhh\0defef\n"<<endl; 结果: 哈德夫 呵呵 呵呵 有人能给我一些指点吗? 答案 Cstd::strings 是"计数"字符串 - 即它们的长度存储为整数,并且它们可以包含任何字符。\0没有什么特别的事情发生 - 它被打印得好像它是任何其他字符(特别是,你的控制台只是忽略它)。 相反,在最后一行中,您将打印一个 C 字符串,其结尾由第一个字符串确定\0发现了。cout继续打印字符,直到找到\0,就你而言,是在第三个之后h。 来自: stackoverflow.com