- S笔记
-
VC特有的预编译宏,比如#pragma once代表头文件只能背包含一次。
- 康康map
-
字节对齐后面常会跟(x)
- snjk
-
预编译宏 后面跟参数 具体的参数由各编译器实现决定
- 苏州马小云
-
VC的宏吧,不是C++标准
C语言预处理中的#pragma有什么用
#pragma是一个预处理指令,会把后面的值传给编译器。这个预处理指令是用于向编译器提供窗外信息的标准方法。对于这个指令C标准中没有明确规定,所以不同编译器实现是不同的。同一个#pragma命令,换一个编译器可能完全没有意义或者是不同意义。格式一般为: #pragma Para。其中Para 为参数。#pragma REGPARMS使用REGPARMS 是让编译器透过暂存器来传函数参数。这样中间的函数速度快些。2023-07-10 17:53:241
C语言:#pragma REGPARMS 是什么意思?
使用#pragma NOREGPARMS指令强迫使用固定存储区传递函数参数 [单片机] 发布时间:2008-09-19 10:44:53 Using the SRC Directive使用指令SRC可以用Cx51编译器来生成一个汇编代码程序,并且用这个程序来决定应该使用的传递规则。指令SRC可以指定Cx51生成一个汇编程序而不是目标程序。例如以下C程序:#pragma SRC#pragma SMALLunsigned int asmfunc1 (unsigned int arg){return (1 + arg);}生成以下的汇编程序:; ASM1.SRC generated from: ASM1.CNAME ASM1?PR?_asmfunc1?ASM1 SEGMENT CODEPUBLIC _asmfunc1; #pragma SRC; #pragma SMALL;; unsigned int asmfunc1 (RSEG ?PR?_asmfunc1?ASM1USING 0_asmfunc1:;---- Variable "arg?00" assigned to Register "R6/R7" ----; SOURCE LINE # 4; SOURCE LINE # 6; return (1 + arg);; SOURCE LINE # 7MOV A,R7ADD A,#01HMOV R7,ACLR AADDC A,R6MOV R6,A; }; SOURCE LINE # 8?C0001:RET; END OF _asmfunc1END在这个例子中,函数名asmfunc1,在汇编程序中加了一个下划线前缀,表明参数通过寄存器传递。参数据arg通过寄存器R6,R7传递以下程序是同一个源程序编译成的汇编程序,只是使用了NOREGPARMS指令; ASM2.SRC generated from: ASM2.CNAME ASM2?PR?asmfunc1?ASM2 SEGMENT CODE?DT?asmfunc1?ASM2 SEGMENT DATAPUBLIC ?asmfunc1?BYTEPUBLIC asmfunc1RSEG ?DT?asmfunc1?ASM2?asmfunc1?BYTE:arg?00: DS 2; #pragma SRC; #pragma SMALL; #pragma NOREGPARMS;; unsigned int asmfunc1 (RSEG ?PR?asmfunc1?ASM2USING 0asmfunc1:; SOURCE LINE # 5; SOURCE LINE # 7; return (1 + arg);; SOURCE LINE # 8MOV A,arg?00+01HADD A,#01HMOV R7,ACLR AADDC A,arg?00MOV R6,A; }; SOURCE LINE # 9?C0001:RET; END OF asmfunc1END2023-07-10 17:53:312
SQLite PRAGMA是干嘛的?作用是?
PRAGMA command 是一个特殊的命令。 它用于修改 SQLite 库操作或查询库以取得内部(非表)数据。 PRAGMA 命令可以使用与其它 SQLite 命令(如 SELECT、INSERT) 相同的接口,只在有如下几个重要方面有所不同:pragma 接受一个整数值 value 或一个名字符号。 字符串 "on ", "true " 以及 "yes " 与 1 是等价的。字符串 "off ", "false ", 和 "no " 则等价于 0 。 这些字符串是不区分大小写的,也不需要双引号。 不能识别的字符串将被认为是 1 , 而不会提示错误。 当返回 value 时,它被看作是一个整数。PRAGMA auto_vacuum; PRAGMA auto_vacuum = 0 | none | 1 | full | 2 | incremental ;在数据库中查询或设置 auto-vacuum 。通常(也就是说在 auto_vacuum 是 0 或 none的时候), 当一个从数据库中删除数据的事务提交时,数据库文件大小不会改变, 未被使用的数据库文件页空间被记入一个“空闲列表”中, 这样,这些空间在以后的 INSERT 中就可以重用。所以, 数据库文件不会缩小。 在这种模式下,可以使用VACUUM 命令来回收未用的空间。如果 auto-vacuum 标志是 1 (full,完全模式),空闲列表中的页将会移到文件的尾部, 那么,当每次提交事务时,就可以通过将文件截断来翻译空闲列表中的页。 但请注意, auto-vacuum 只会从数据库文件中载断空闲列表中的页, 而不会回收数据库中的碎片,也不会像VACUUM 命令那样重新整理数据库内容。实际上,由于需要在数据库文件中移动页, auto-vacuum 会产生更多的碎片。要使用 auto-vacuum,需要一些前题条件。 数据库中需要存储一些额外的信息以记录它所跟踪的每个数据库页都找回其指针位置。 所以,auto-vacumm 必须在建表之前就开启。在一个表创建之后, 就不能再开启或关闭 auto-vacumm。如果 auto-vacuum 的值是 2 (incremental,增量模式) ,那么,自动 vacuum 需要使用存放在数据库文件中的另外的信息。但它不会像 auto_vacuum == full 那样在每次事务提交的时候发生。在增量模式下,必须使用独立的 incremental_vacuum pragma 来引发 vacuum。数据库连接可以自由地在完全和增量模式间切换。但是, 如果数据库中已经建了一个表,连接就不能切换到 none 模式, 也不能从 none 模式切换成别的模式。PRAGMA cache_size; PRAGMA cache_size = Number-of-pages ;查询可修改 SQLite 一次可以在内存中保持的数据库磁盘页数量的最大值。 每一页大约需要 1.5K 的内存空间。缺省值是2000。 如果你需要做大的 UPDATE 或 DELETE 操作,每次会影响相当多的数据库行, 并且你也不在乎 SQLite 占用更多的内存,那么,你就可以增加缓存的大小, 这样,以获得可能的速度的提升。当你使用 cache_size pragma 修改缓存大小以后, 改变只会对当前的会话起作用。数据库连接关闭并重新连接后, 它又会变成缺省的大小。如果要永久修改缓存值,则需要使用default_cache_sizePRAGMA case_sensitive_like; PRAGMA case_sensitive_like = 0 | 1 ;对于 latin1 字符,LIKE 操作符缺省的行为会忽略大小写。 也就是说,默认情况下, "a" LIKE "A" 的结果是true。 可以通过开启该 pragma 来改变这种行为。当启用 case_sensitive_like 后,"a" LIKE "A" 会是 false 但 "a" LIKE "a" 仍然是 true.PRAGMA count_changes; PRAGMA count_changes = 0 | 1 ;查询或修改 count-changes 标志。通常, 没有设置 count-changes ,则 INSERT, UPDATE 和 DELETE 语句不会返回任何数据。 当设置该值时,这些命令都会返回由一个整数组成的一行数据, 该整数表示被该命令所插入,修改或删除的行数, 但不包括任何由触发器插入、修改或删除的行。PRAGMA default_cache_size; PRAGMA default_cache_size = Number-of-pages ;查询或设置 SQLite 可在内存中同时保持的数据库磁盘文件页, 每占用 1K 磁盘空间的页需要大约 1.5K 的内存。 该 pragma 类似cache_size 。 只是,它会永久改变缓存的值。通过该 pragma, 可以一次设置缓存值,以后每次后新打开数据库时都将使用该值。PRAGMA default_synchronous;该 pragma 在 2.8 版本中可用,但在 3.0 中删除了。 使用它非常危险,因此也不推荐使用。 为帮助2.8版本的用户不再使用该 pragma, 本文档不会告诉你它怎么用。PRAGMA empty_result_callbacks; PRAGMA empty_result_callbacks = 0 | 1 ;查询或设置 empty-result-callbacks 标志。该标志只会影响 sqlite3_exec API。 通常,当清除该标志时,如果命令返回 0 行数据, 则不会引发用于 sqlite3_exec()上的回调函数。 但若在这种情况下设置了 empty_result_callbacks, 则回调函数会将第三个参数置为 0 (NULL) 并进行调用,且只会调用一次。 这可以使用调用 sqlite3_exec() API 的程序即使在没有返回数据的情况下也可以获得列名。PRAGMA encoding; PRAGMA encoding = "UTF-8"; PRAGMA encoding = "UTF-16"; PRAGMA encoding = "UTF-16le"; PRAGMA encoding = "UTF-16be";第一种格式,主数据库已创建。那么该 pragma 会返回主数据库所使用的文件编码。 可能是: "UTF-8", "UTF-16le" (小印第安 UTF-16 编码) 或 "UTF-16be" (大印第安 UTF-16 编码)。 如果主数据库没有创建, 那么返回值将是将要用于创建主数据库的文本编码(如果在当前会话中创建的话)。第二种以及以后的格式只有在主数据库未创建时有用。 在这种情况下,该 pragma 将会把数据库编码设为在当前会话中将要创建的数据库所使用的编码。 字符串“UTF-16”会被解释为“本机字节顺序的UTF-16编码”。 若第二种及以后的格式用于已创建的数据库文件上, 则它们会被默默地忽略而不起任何作用。一旦为数据库设置了字符编码,就不能再更改。使用 ATTACH 命令创建的数据库记录使用与主数据相同的编码。PRAGMA full_column_names; PRAGMA full_column_names = 0 | 1 ;查询或修改 full-column-names 标志。 该标志会影响当 SELECT 查询后面的列表是一个 “表-列名” 或 “*”时 SQLite返回列名的方式。通常, 如果 SELECT 语句连接两个或多个表, 结果列名将是 <表名/别名><列名>; 而若仅仅对单个表查询时,将是 <column-name>。 但如果设置了 full-column-names 标志,列名将永远是 <table-name/alias> <column-name> , 而不管是只查询一个表或同时连接多个表。如果 short-column-names 和 full-column-names 都设置了, 则会以 full-column-names 为准。PRAGMA fullfsync PRAGMA fullfsync = 0 | 1 ;查询修改 fullfsync 标志。 该标志影响在支持 F_FULLFSYNC 同步方法的系统上,是否使用该方法。 默认值是 off (不使用)。 在写本文的时候 (2006-02-10),只有 Mac OS X 支持 F_FULLFSYNC。PRAGMA incremental_vacuum (N) ;Incremental_vacuum pragma 会导致从空闲列表中最多移除 N 页。 数据库文件也会按该数量截断。如果数据库不在 auto_vacuum==incremental 模式, 或空闲列表中没有页,则该 pragma 不起作用。 如果空闲列表中不到N 页,那么,整个空闲列表会被清空。对于 3.4.0版来说 (第一个支持 incremental_vacuum 的版本) , 该我仍然是试验性的。未来可能会增强该功能,包括像 VACUUM 命令那样整理碎片以及节点重整等。 并且,增量 vacuum 可能会从 pragma 变为一个单独的 SQL 命令, 也许会是 VACUUM 命令的变体。程序员们要注意不要迷恋于当前的语法, 因为以后有可能会改变。PRAGMA legacy_file_format; PRAGMA legacy_file_format = ON | OFF本 pragma 设置或查询 legacy_file_format 标志的值。 当它为 on 时,新创建的数据库文件格式可以被3.0.0以后的版本读写。 如果它为 off,则会使用最新的数据库文件格式,旧版本的SQLite将无法读写。当不带参数使用该 pragma 时,它返回该标志当前的值。 它 不 会 告诉你当前数据库所使用的文件格式, 而只会表明在以后创建新数据库时将使用何种格式。该标志只对新创建数据库有效。对已存在的数据库不起作用。PRAGMA locking_mode; PRAGMA locking_mode = NORMAL | EXCLUSIVE该 pragma 设置或查询数据库连接的锁模式。 锁模式可能是 NORMAL 或 EXCLUSIVE.在 NORMAL 模式下, (默认值), 一个数据库连接会在每次完成读或写时释放数据库文件锁。 当锁模式设为 EXCLUSIVE 时,数据库连接永远不会释放文件锁。 在该模式下,当第一次读数据库文件时,会获得并持有一个共享锁。 当第一次向数据库写时,将获得并持有一个排它锁。在 EXCLUSIVE 模式下获得的锁可以通过关闭数据库连接来释放, 也可以通过使用该 pragma 将锁模式改为 NORMAL,并且再次访问(读或写) 数据库来释放。仅仅将锁模式置为 NORMAL 是不够的, 直到下一次访问数据库文件时才会释放已持有的锁。有两种原因要求设置 EXCLUSIVE 锁模式。 一是一个应用程序确实不希望其它进程访问数据库文件。 二是在这种模式下可以使用优化器,它可以节省少量的磁盘文件操作。 这在嵌入式系统中可能非常重要。当 locking_mode pragma 指定一个特定的数据库时,如:PRAGMA main. locking_mode=EXCLUSIVE;那么,锁模式只会对该数据库有效。如果不指定数据库名称, 那么锁模式会应用于所有数据库,包括以后使用 ATTACH 命 令连接的数据库。临时( temp) 数据库 (用于存放临时表和索引)永远使用 EXCLUSIVE 锁模式。临时数据库的锁模式不能改变。所有其它的数据库则默认使用 NORMAL 锁模式,并可以通过使用 pragma 改变。PRAGMA page_size; PRAGMA page_size = bytes ;查询或设置数据库的 page-size 。只能在数据库创建之间设置 page-size。 页的大小必须是 2 的幂, 且幂指数只能在 512 和 8192 之间。 其上限可以在编译时通过修改源代码中的 SQLITE_MAX_PAGE_SIZE 修改, 但最大不能超过32768。PRAGMA max_page_count; PRAGMA max_page_count = N ;查询或设置数据库文件最大的页数。 两种格式都会返回最大的页数。第二种格式试图修改最大页数。 最大页数不能修改为小于当前数据库的大小。PRAGMA read_uncommitted; PRAGMA read_uncommitted = 0 | 1 ;查询,设置或清除 READ UNCOMMITTED (读未提义)隔离级别。 SQLite 默认的隔离级别是 SERIALIZABLE (可串行化)。 任何进程或线程都可以选择 READ UNCOMMITTED 级别。但除了在数据库连接间共享一个通过页和模式缓存外,仍然会使用 SERIALIZABLE 隔离级别。 共享缓存可以使用 sqlite3_enable_shared_cache() API 开启, 并且只能在执行同一线程的连接间开启。共享缓存默认是关闭的。PRAGMA short_column_names; PRAGMA short_column_names = 0 | 1 ;查询或修改 short-column-names 标志。 该标志会影响当 SELECT 查询后面的列表是一个 “表-列名” 或 “*”时 SQLite返回列名的方式。 通常, 如果 SELECT 语句连接两个或多个表, 结果列名将是 <表名/别名><列名>; 而若仅仅对单个表查询时,将是 <column-name>。 但如果设置了 short-column-names 标志,列名将永远是 <column-name> , 而不管是只查询一个表或同时连接多个表。如果 short-column-names 和 full-column-names 都设置了, 则以 full-column-names 标志为准。PRAGMA synchronous; PRAGMA synchronous = FULL; (2) PRAGMA synchronous = NORMAL; (1) PRAGMA synchronous = OFF; (0)查询或设置 synchronous 标志。 第一种格式返回一个整数,当 synchronous 为 FULL (2) 时, SQLite 数据库引擎将会在重要的时刻暂停, 以保证在继续运行之前数据确实已经写到磁盘上去了。 这能保证在遇到操作系统崩溃可电源故障时, 重新启动机器数据库文件不会被破坏。FULL 同步方式是非常安全的, 但也是很慢的。若 synchronous 设为 NORMAL,则 SQLite 数据库引擎将在大多数重要时刻暂停,但比在 FULL 模式要少。 在极少情况下,处理这种模式的数据库文件可能会由于“不是时候” 的电源故障而导致受损。但在实际应用中, 更有可有遭受到灾难性的磁盘故障或其它无法恢复的硬件故障。 若将 synchronous 设为 OFF (0),那么 SQLite 从操作系统取得数据后将会立即进行处理而不会暂停。 如果使用 SQLite 的应用程序崩溃,数据将是安全的。 但如果在数据写入磁盘之前,操作系统死机或机器断电, 数据库文件可能会损坏。此外,在该模式下, 某些操作会比其它情况下快 50 倍。在 SQLite 版本 2 中,默认值是 NORMAL。 对于版本 3, 默认值是 FULL。PRAGMA temp_store; PRAGMA temp_store = DEFAULT; (0) PRAGMA temp_store = FILE; (1) PRAGMA temp_store = MEMORY; (2)2023-07-10 17:53:411
pragma 如何读
读数据:read(unsigned int address) 写数据:write(unsigned int address,unsigned char dd) dd为要写的... #pragma disable unsigned char rd88(void) /////////////////从88c88读一字节数据 { ACC=1x11; ...2023-07-10 17:53:492
预处理指令#pragma db code是什么意思?
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和 C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 其格 式一般为: #Pragma Para 其中Para 为参数,下面来看一些常用的参数。 (1)message 参数。 Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗 口中输出相应的信息,这对于源代 码信息的控制是非常重要的。其使用方法为: #Pragma message(“消息文本”) 当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。 当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假 设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法 #ifdef _X86 #Pragma message(“_X86 macro activated!”) #endif 当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_ X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了 。 (2)另一个使用得比较多的pragma参数是code_seg。格式如: #pragma code_seg( ["section-name"[,"section-class"] ] ) 它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。 (3)#pragma once (比较常用) 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。 (4)#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太 多磁盘空间,所以使用这个选项排除一些头文件。 有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。 (5)#pragma resource "*.dfm"表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体2023-07-10 17:54:114
nginx pragma 有哪些参数
参考下面的nginx配置高并发一、一般来说nginx配置文件中对优化比较有作用的为以下几项:1.worker_processes8;nginx进程数,建议按照cpu数目来指定,一般为它的倍数(如,2个四核的cpu计为8)。2.worker_cpu_affinity0000000100000010000001000000100000010000001000000100000010000000;为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。3.worker_rlimit_nofile65535;这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit-n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit-n的值保持一致。现在在linux2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。查看linux系统文件描述符的方法:[root@web001~]#sysctl-a|grepfs.filefs.file-max=789972fs.file-nr=51007899724.useepoll;使用epoll的I/O模型(补充说明:与apache相类,nginx针对不同的操作系统,有不同的事件模型A)标准事件模型Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或pollB)高效事件模型Kqueue:使用于FreeBSD4.1+,OpenBSD2.9+,NetBSD2.0和MacOSX.使用双处理器的MacOSX系统使用kqueue可能会造成内核崩溃。Epoll:使用于Linux内核2.6版本及以后的系统。/dev/poll:使用于Solaris711/99+,HP/UX11.22+(eventport),IRIX6.5.15+和Tru64UNIX5.1A+。Eventport:使用于Solaris10.为了防止出现内核崩溃的问题,有必要安装安全补丁。)5.worker_connections65535;每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。6.keepalive_timeout60;keepalive超时时间。7.client_header_buffer_size4k;客户端请求头部的缓冲区大小,这个可以根据系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconfPAGESIZE取得。[root@web001~]#getconfPAGESIZE4096但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。8.open_file_cachemax=65535inactive=60s;这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。9.open_file_cache_valid80s;这个是指多长时间检查一次缓存的有效信息。10.open_file_cache_min_uses1;open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。二、关于内核参数的优化:net.ipv4.tcp_max_tw_buckets=6000timewait的数量,默认是180000。net.ipv4.ip_local_port_range=102465000允许系统打开的端口范围。net.ipv4.tcp_tw_recycle=1启用timewait快速回收。net.ipv4.tcp_tw_reuse=1开启重用。允许将TIME-WAITsockets重新用于新的TCP连接。net.ipv4.tcp_syncookies=1开启SYNCookies,当出现SYN等待队列溢出时,启用cookies来处理。net.core.somaxconn=262144web应用中listen函数的backlog默认会给内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。net.core.netdev_max_backlog=262144每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。net.ipv4.tcp_max_orphans=262144系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。net.ipv4.tcp_max_syn_backlog=262144记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。net.ipv4.tcp_timestamps=0时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。net.ipv4.tcp_synack_retries=1为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。net.ipv4.tcp_syn_retries=1在内核放弃建立连接之前发送SYN包的数量。net.ipv4.tcp_fin_timeout=1如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2内核的通常值是180秒,3.可以按这个设置,但要记住的是,即使机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN-WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。net.ipv4.tcp_keepalive_time=30当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。三、下面贴一个完整的内核优化设置:vi/etc/sysctl.confCentOS5.5中可以将所有内容清空直接替换为如下内容:net.ipv4.ip_forward=0net.ipv4.conf.default.rp_filter=1net.ipv4.conf.default.accept_source_route=0kernel.sysrq=0kernel.core_uses_pid=1net.ipv4.tcp_syncookies=1kernel.msgmnb=65536kernel.msgmax=65536kernel.shmmax=68719476736kernel.shmall=4294967296net.ipv4.tcp_max_tw_buckets=6000net.ipv4.tcp_sack=1net.ipv4.tcp_window_scaling=1net.ipv4.tcp_rmem=4096873804194304net.ipv4.tcp_wmem=4096163844194304net.core.wmem_default=8388608net.core.rmem_default=8388608net.core.rmem_max=16777216net.core.wmem_max=16777216net.core.netdev_max_backlog=262144net.core.somaxconn=262144net.ipv4.tcp_max_orphans=3276800net.ipv4.tcp_max_syn_backlog=262144net.ipv4.tcp_timestamps=0net.ipv4.tcp_synack_retries=1net.ipv4.tcp_syn_retries=1net.ipv4.tcp_tw_recycle=1net.ipv4.tcp_tw_reuse=1net.ipv4.tcp_mem=94500000915000000927000000net.ipv4.tcp_fin_timeout=1net.ipv4.tcp_keepalive_time=30net.ipv4.ip_local_port_range=102465000使配置立即生效可使用如下命令:/sbin/sysctl-p四、下面是关于系统连接数的优化linux默认值openfiles和maxuserprocesses为1024#ulimit-n1024#ulimit–u1024问题描述:说明server只允许同时打开1024个文件,处理1024个用户进程使用ulimit-a可以查看当前系统的所有限制值,使用ulimit-n可以查看当前的最大打开文件数。新装的linux默认只有1024,当作负载较大的服务器时,很容易遇到error:toomanyopenfiles。因此,需要将其改大。解决方法:使用ulimit–n65535可即时修改,但重启后就无效了。(注ulimit-SHn65535等效ulimit-n65535,-S指soft,-H指hard)有如下三种修改方式:1.在/etc/rc.local中增加一行ulimit-SHn655352.在/etc/profile中增加一行ulimit-SHn655353.在/etc/security/limits.conf最后增加:*softnofile65535*hardnofile65535*softnproc65535*hardnproc65535具体使用哪种,在CentOS中使用第1种方式无效果,使用第3种方式有效果,而在Debian中使用第2种有效果#ulimit-n65535#ulimit-u65535备注:ulimit命令本身就有分软硬设置,加-H就是硬,加-S就是软默认显示的是软限制soft限制指的是当前系统生效的设置值。hard限制值可以被普通用户降低。但是不能增加。soft限制不能设置的比hard限制更高。只有root用户才能够增加hard限制值。五、下面是一个简单的nginx配置文件:userp_level2;gzip_typestext/plainapplication/x-javascripttext/cssapplication/xml;gzip_varyon;server{listen8080;server_namebackup.aiju.com;indexindex.phpindex.htm;root/www/html/;location/status{stub_statuson;}location~.*.(php|php5)?${fastcgi_pass127.0.0.1:9000;fastcgi_indexindex.php;includefcgi.conf;}location~.*.(gif|jpg|jpeg|png|bmp|swf|js|css)${expires30d;}log_formataccess"$remote_addr--$remote_user[$time_local]"$request"""$status$body_bytes_sent"$http_referer""""$http_user_agent"$http_x_forwarded_for";access_log/www/log/access.logaccess;}}2023-07-10 17:54:191
关于C语言预处理命令
第二局2023-07-10 17:54:306
pragma 这个东西貌似在LINUX C里面非常常见,求一个比较有经验的人来帮我讲一讲pragma的一些常规用法。
“#pragma”Visual C++ 多一些。经常是 “#pragma once”(包含一次)Linux见 man gcc2023-07-10 17:54:462
#if 1 #pragma import(__use_no_semihosting) 在STM32中请问这句是什么意思??
宏。从 if 起 到 endif 中保证 “不使用/不输入/不调用 semihosting“2023-07-10 17:54:542
#pragma是什么意思?
这个预处理指令是用于向编译器提供窗外信息的标准方法。它向编译器提供的信息不具备可移植性,例如: 向VC编译器 提供的信息不一定适合于BCB。2023-07-10 17:55:131
请问:vc中,#paragma once是什么意思?
包含pragma once语句的文件只会被编译一次。2023-07-10 17:55:212
#pragma warning (disable : 4996)
1.#pragma warning(disable: n)将某个警报置为失效2.#pragma warning(default: n)将报警置为默认http://hi.baidu.com/iceland9/blog/item/5af9c0bfd334de0a18d81f33.html2023-07-10 17:55:292
STM32 #pragma 什么意思
#pragma 编译预处理指令;后面带参数massage、code_seg之类。用来打印信息或指定编译规则的。2023-07-10 17:55:371
请问#pragma DATA_ALIGN有什么作用?
设定变量的地址对齐方式。比如:int abc;#pragma DATA_ALIGN(abc, 128)那么编译时一定会把abc变量的地址安排在128字节对齐的位置上,也即abc地址的低7位一定为0,又比如char efd;#prgma DATA_ALIGN(efd, 8)那么编译时一定会把efd变量的地址安排在8字节对齐的位置上,也即efd地址的低3位一定为0。pragma DATA_ALIGN是非常有用的,也经常使用的。2023-07-10 17:55:532
#pragma的问题
就是告诉编译器,不要优化如果优化的话,因为while里面的东西是一样的,有些编译器会把while循环优化掉,造成延时时间不正确甚至不延时。谢谢采纳2023-07-10 17:56:021
#pragma SAVE #pragma REGPARMS ...... #pragma RESTORE 单片机程序中这三句话是什么意思?求指点
SAVE 是把 AREGS, REGPARMS, OPTIMIZE 这三者的设定暂时存起来,等到RESTORE的时候恢复。REGPARMS 是让编译器透过暂存器来传函数参数。因为中间那些函数(isalpha..)是这样定义的。这样的函数速度快些。初学者不必管这些细节,直接用就是了。2023-07-10 17:56:091
#pragma comment(lib,"ws2_32.lib")是什么意思?
这句话的前面意思是静态加入一个lib文件。也就是库文件。ws2_32.lib文件,提供了对以下网络相关API的支持,若使用其中的API,则应该将ws2_32.lib加入工程(否则需要动态载入ws2_32.dll)。这句话一般出现在网络编程中,需要使用网络API函数的时候,就必须使用这条语句加载ws2_32.lib库或者动态载入ws2_32.dll。2023-07-10 17:56:172
C语言中 #prama pack(1) 是什么呢
意思是把数据对齐到1的倍数,那也就是取消掉对齐了 所谓对齐就是安排数据让它的起始地址在一个合适的位置上,避免用2条语句读入数据的情况。 比如下面的结构, struct a{ char c; long l;}c占用了1个字节(第0字节), 但是l默认会被安排在 4-7字节,整个占用8字节。如果先写了 这句 pragma pack(1) , 结果就是 c占用第0字节, 而l安排在1-4字节,整个占用5字节。 虽然省地方, 可是读入l就费劲了, 得读两次到寄存器,再挪到一起去, 要慢不少 还有,这个不是c的标准内容而是vc的增加内容。 其他编译器也有类似的调整对齐机制,但是是不一样的语法2023-07-10 17:56:351
C++中#PRAGMA ONCE和#DEFINE是干什么用的
这是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。 #pragma once是编译器相关的,就是说即使这个编译系统上有效,但在其他编译系统也不一定可以,不过现在基本上已经是每个编译器都有这个杂注了。 #ifndef,#define,#endif是C/C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式2023-07-10 17:56:421
#pragma vector=PORT1_VECTOR __interrupt void Port_1(void)是什么意思,MSP430G2553初学,一点不懂
这应该属于嵌入式系统范围。MSP430内部有一个中断向量表,只要往里面对应向量(实际也是某地址)填相应函数的首地址,该中断发生时,就能根据填入的函数首地址自动跳转到该函数。#pragma vector=这句话就是给这个中断向量表进行赋值的。#pragma vector=PORT1_VECTOR表示给这个向量表中的外部端口中断所对应的地址进行赋值,并赋值为函数void Port_1(void)的首地址。其中,关键字__interrupt则表示这个函数是中断服务函数这种特殊函数。2023-07-10 17:56:481
c/c++中#pragma的英文意思
伪指令而已 不同的编译器可能压根就没有 vc里就是告诉cl.exe 传话给 link.exe 把 xxx.lib静态库给链接上2023-07-10 17:56:564
C++中#pragma pack(push)
#pragma pack(push)这是给编译器用的参数设置,有关结构体字节对齐方式的设置是指把原来对齐方式设置压栈,按照默认的字节对齐方式对齐,如果想重新设置对齐方式,类似的:#pragma pack(push,1),按照1字节对齐2023-07-10 17:57:041
单片机编程里看到一句#pragma SRC 是怎么回事
编译控制命令“#pragma src”是控制编译器将C源文件编译成汇编文件,“#pragma src”要放在文件的开始。2023-07-10 17:57:111
在objective-C中#pragma mark是什么意思
从技术上讲,以 #pragma 开头的代码是一条编译器指令,是一个特定于程序或编译器的指令。它们不一定适用于其它编译器或其它环境。如果编译器不能识别该指令,则会将其忽略。 作用它们告诉Xcode编译器,要在编辑器窗格顶部的方法和函数弹出菜单中将代码分隔开,如下图所示:一些类(尤其是一些控制器类)可能很长,方法和函数弹出菜单可以便于代码导航。此时加入#pragma 指令对代码进行逻辑组织很有效果。 注意 #pragma mark – 的“-”后面不能有空格。 如果你的标志没有出现在弹出菜单中,比如没有分隔线出现,请在Xcode菜单 “Preferences..”中的 “Code Sense”选项取消选中”Sort list alphabetically”即可。2023-07-10 17:57:181
#pragma userclass (HDATA=ERAM)声明的作用?
#pragma 是编译器预处理命令。接下来是参数。允许的参数与编译器有关。你这个像是单片机的预处理命令。顾名思义,userclass 声明用户定义的 类,扩号里是参数。2023-07-10 17:57:301
KEIL程序编译后出现如下提示,要怎么在程序中屏蔽掉#pragma src
错误提示应该是你使用了浮点数的运算函数,但编译器找不到对应的库C51FPS.LIB。是不是库被你删了,还是它找不到中文目录的库,我没在中文目录下安装过。你看一下,如果库没了,重装一下应该就可以了。不知道你为什么问屏蔽#pragma src,图片确实库错误的。2023-07-10 17:57:391
c语言中预处理命令都有哪些?
我们可以在C源程序中插入传给编译程序的各中指令,这些指令被称为预处理器指令,它们扩充了程序设计的环境。现把常用的预处理命令总结如下: x0dx0a1. 预处理程序x0dx0a按照ANSI标准的定义,预处理程序应该处理以下指令:x0dx0a#if #ifdef #ifndef #else #elifx0dx0a#endifx0dx0a#definex0dx0a#undefx0dx0a#linex0dx0a#errorx0dx0a#pragmax0dx0a#includex0dx0a显然,上述所有的12个预处理指令都以符号#开始,,每条预处理指令必须独占一行。x0dx0a2. #definex0dx0a#define指令定义一个标识符和一个串(也就是字符集),在源程序中发现该标识符时,都用该串替换之。这种标识符称为宏名字,相应的替换称为宏代换。一般形式如下:x0dx0a#define macro-name char-sequencex0dx0a这种语句不用分号结尾。宏名字和串之间可以有多个空白符,但串开始后只能以新行终止。x0dx0a例如:我们使用LEFT代表1,用RIGHT代表0,我们使用两个#define指令:x0dx0a#define LEFT 1x0dx0a#define RIGHT 0x0dx0a每当在源程序中遇到LEFT或RIGHT时,编译程序都用1或0替换。x0dx0a定义一个宏名字之后,可以在其他宏定义中使用,例如:x0dx0a#define ONE 1x0dx0a#define TWO ONE+ONEx0dx0a#define THREE ONE+TWOx0dx0a宏代换就是用相关的串替代标识符。因此,如果希望定义一条标准错误信息时,可以如下定义:x0dx0a#define ERROR_MS “Standard error on input ”x0dx0a如果一个串长于一行,可在行尾用反斜线””续行,如下:x0dx0a#define LONG_STRING “This is a very very long \x0dx0aString that is used as an example”x0dx0a3. #errorx0dx0a#error指令强制编译程序停止编译,它主要用于程序调试。#error指令的一般形式是:x0dx0a#error error-messagex0dx0a注意,宏串error-message不用双引号包围。遇到#error指令时,错误信息被显示,可能同时还显示编译程序作者预先定义的其他内容。x0dx0a4. #includex0dx0a程序中的#include指令要求编译程序读入另一个源文件。被读入文件的名字必须用双引号(“”)或一对尖括号(<>)包围,例如:x0dx0a#include “stdio.h”x0dx0a#include x0dx0a都使C编译程序读入并编译头文件以用于I/O系统库函数。x0dx0a包含文件中可以包含其他#include指令,称为嵌套包含。允许的最大嵌套深度随编译器而变。x0dx0a文件名被双括号或尖括号包围决定了对指定文件的搜索方式。文件名被尖括号包围时,搜索按编译程序作者的定义进行,一般用于搜索某些专门放置包含文件的特殊目录。当文件名被双括号包围时,搜索按编译程序实时的规定进行,一般搜索当前目录。如未发现,再按尖括号包围时的办法重新搜索一次。x0dx0a通常,绝大多数程序员使用尖括号包围标准的头文件,双引号用于包围与当前程序相关的文件名。x0dx0ax0dx0a5. 条件编译指令x0dx0a若干编译指令允许程序员有选择的编译程序源代码的不同部分,这种过程称为条件编译。x0dx0a5.1#if、#else、#elif #endifx0dx0a条件编译指令中最常用的或许是#if,#else,#elif和#endif。这些指令允许程序员根据常数表达式的结果有条件的包围部分代码。x0dx0a#if的一般形式是:x0dx0a#if constant-expressionx0dx0aStatement sequencex0dx0a#endifx0dx0a如#if后的常数表达式为真,则#if和#endif中间的代码被编译,否则忽略该代码段。#endif标记#if块的结束。x0dx0a#else指令的作用与C语言的else相似,#if指令失败时它可以作为备选指令。例如:x0dx0a#include x0dx0a#define MAX 100x0dx0aInt main(void)x0dx0a{x0dx0a#if MAX>99x0dx0aprintf(“Compiled for array greater than 99. ”);x0dx0a#elsex0dx0aprintf(“Complied for small array. ”);x0dx0a#endifx0dx0areturn 0;x0dx0a}x0dx0a注意,#else既是标记#if块的结束,也标记#else块的开始。因为每个#if只能写一个#endif匹配。x0dx0a#elif指令的意思是“否则,如果”,为多重编译选择建立一条if-else-if(如果-否则-如果链)。如果#if表达式为真,该代码块被编译,不测试其他#elif表达式。否则,序列中的下一块被测试,如果成功则编译之。一般形式如下:x0dx0a#if expressionx0dx0aStatement sequencex0dx0a#elif expression1x0dx0aStatement sequencex0dx0a#elif expression2x0dx0aStatement sequencex0dx0a.x0dx0a.x0dx0a.x0dx0a#elif expressionx0dx0aStatement sequencex0dx0a#endifx0dx0a5.2#ifdef和#ifndefx0dx0a条件编译的另一个方法是使用编译指令#ifdef和#ifndef,分别表示“如果已定义”和“如果未定义”。#ifdef的一般形式如下:x0dx0a#ifdef macro-namex0dx0aStatement sequencex0dx0a#endifx0dx0a如果macro-name原先已经被一个#define语句定义,则编译其中的代码块。x0dx0a#ifndef的一般形式是:x0dx0a#ifndef macro-namex0dx0aStatement sequencex0dx0a#endifx0dx0a如果macro-name当前未被#define语句定义,则编译其中的代码块。x0dx0ax0dx0a我认为,用这种,可以很方便的开启/关闭整个程序的某项特定功能。x0dx0a#ifdef和#ifndef都可以使用#else或#elif语句。x0dx0a#inlucde x0dx0a#define T 10x0dx0aInt main(void)x0dx0a{x0dx0a#ifdef tx0dx0aPrintf(“Hi T ”);x0dx0a#elsex0dx0aPrintf(“Hi anyone ”);x0dx0a#endifx0dx0a#ifndef Mx0dx0aPrintf(“M Not Defined ”);x0dx0a#endifx0dx0aReturn 0;x0dx0a}x0dx0a6. #undefx0dx0a#undef指令删除前面定义的宏名字。也就是说,它“不定义”宏。一般形式为:x0dx0a#undef macro-namex0dx0a7. 使用definedx0dx0a除#ifdef之外,还有另外一种确定是否定义宏名字的方法,即可以将#if指令与defined编译时操作符一起使用。defined操作符的一般形式如下:x0dx0adefined macro-namex0dx0a如果macro-name是当前定义的,则表达式为真,否则为假。x0dx0a例如,确定宏MY是否定义,可以使用下列两种预处理命令之一:x0dx0a#if defined MYx0dx0a或x0dx0a#ifdef MYx0dx0a也可以在defined之前加上感叹号”!”来反转相应的条件。例如,只有在DEBUG未定义的情况下才编译。x0dx0a#if !defined DEBUGx0dx0aPrintf(“Final Version! ”);x0dx0a#endifx0dx0a使用defined的一个原因是,它允许由#elif语句确定的宏名字存在。x0dx0a8. #linex0dx0a#line指令改变__LINE__和__FILE__的内容。__LINE__和__FILE__都是编译程序中预定义的标识符。标识符__LINE__的内容是当前被编译代码行的行号,__FILE__的内容是当前被编译源文件的文件名。#line的一般形式是:x0dx0a#line number “filename”x0dx0a其中,number是正整数并变成__LINE__的新值;可选的“filename”是合法文件标识符并变成__FILE__的新值。#line主要用于调试和特殊应用。x0dx0ax0dx0a9. #pragmax0dx0a#pragma是编译程序实现时定义的指令,它允许由此向编译程序传入各种指令。例如,一个编译程序可能具有支持跟踪程序执行的选项,此时可以用#pragma语句选择该功能。编译程序忽略其不支持的#pragma选项。#pragma提高C源程序对编译程序的可移植性。x0dx0a10. 预处理操作符#和##x0dx0a有两个预处理操作符:#和##,它们可以在#define中使用。x0dx0a操作符#通常称为字符串化的操作符,它把其后的串变成用双引号包围的串。例如:x0dx0a#include x0dx0a#define mkstr(s) #sx0dx0aint main(void)x0dx0a{x0dx0aPrintf(mkstr(I like C));x0dx0aReturn 0;x0dx0a}x0dx0a预处理程序把以下的语句:x0dx0aPrintf(mkstr(I like C));x0dx0a变成x0dx0aPrintf(“I like C”);x0dx0a操作符##把两个标记拼在一起,形成一个新标记。例如:x0dx0a#include x0dx0a#define concat(a,a) a##bx0dx0aint main(void)x0dx0a{x0dx0aInt xy = 10;x0dx0aPrintf(“%d”,concat(x,y));x0dx0aReturn 0;x0dx0a}x0dx0a预处理程序把以下语句:x0dx0aPrintf(“%d”,concat(x,y));x0dx0a变成x0dx0aPrintf(“%d”,xy);x0dx0a操作符#和##主要作用是允许预处理程序对付某些特殊情况,多数程序中并不需要。x0dx0a11. 预定义宏x0dx0aC规范了5个固有的预定义宏,它们是:x0dx0a__LINE__x0dx0a__FILE__x0dx0a__DATE__x0dx0a__TIME__x0dx0a__STDC__x0dx0a__LINE__和__FILE__包含正在编译的程序的行号和文件名。x0dx0a__DATE__和内容形如month/day/year(月/日/年)的串,代表源文件翻译成目标码的日期。x0dx0a__TIME__中的串代表源代码编译成目标码的时间,形如hour:minute:second(时:分:秒)x0dx0a如果__STDC__的内容是十进制常数1,则表示编译程序的实现符合标准C。2023-07-10 17:58:061
#pragma once和ifdefine的区别
#if !defined(AFX_RESIZABLELAYOUT_H__INCLUDED_) #define AFX_RESIZABLELAYOUT_H__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 ... #endif // !defined(AFX_RESIZABLELAYOUT_H__INCLUDED_) 对于宏有基本了解的朋友应该都知道,头文件中如下的宏定义,是为了避免同样的头文件在同一个.C文件或者.CPP文件多次包含。 #if !defined(XXX) #define XXX #endif 这很好理解,但接下来的一段,尤其是#pragma once的意思,我就不是很清楚了。从MSDN得到pragma once的解释是: "Specifies that the file will be included (opened) only once by thecompiler when compiling a source code file." 英文注释的大意也是说#pragma once是为了避免文件重复包含。疑惑就此产生了,既然宏"#if !defined"已经有这个作用了,为何还要一个"#pragma once"呢? 我接着在网上搜到了几份答案,但大家的回答都很模糊,于是我想放弃,不再想这个问题,但还是不太甘心,就接着看了看别人的解释。突然间,好像灵犀一点,开窍了。虽然"#if !define"和"#pragma once"都有避免重复包含的功能,但是在实现上还是有区别的。举一例如下: // Test1.h #if !define (__TESTONE_H_) #define __TESTONE_H_ ... #endif // Test2.h #pragma once ... // Test.cpp #include "Test1.h" // line 1 #include "Test1.h" // line 2 #include "Test2.h" // line 3 #include "Test2.h" // line 42023-07-10 17:58:133
pragma pack是什么意思
作用:调整结构体的边界对齐,让其以一个字节对齐; #pragma pack(1) 使结构体按1字节方式对齐例如:struct sample{char a;double b;};若不用#pragma pack(1)和#pragma pack()括起来,则sample按编译器默认方式对齐(成员中size最大的那个)。即...2023-07-10 17:58:201
# pragma interrupt_level 1这个在pic单片机中的作用是什么啊?详细说明一下谢谢
这是一个禁止中断的命令。2023-07-10 17:58:272
是什么意思?
这三行只能避免HTML页面缓存,要想JSP页面不缓存还需在JSP中设置这些属性。2023-07-10 17:58:372
关于#pragma pack()的预处理指令
既然是团队求助,那我来回答好了。是这样的,设定为4字节对齐之后,每个成员变量所占空间应该是4的倍数,char m1,本来是一个字节,要加入3个字节,所以是4;double m4;本来就是8个字节,为4的倍数,不必补齐,是8;int m3;占4个字节,也是4的倍数,不必补齐,是4;那么4+8+4是16,这没错。同理,设定为#pragma pack(8),8字节对齐,那么里面全是8,有8X3=24;你所说的有误。M1的时候偏移量是0,但是M3的时候偏移量却不是4,而应该是12;你自己理解一下就知道了,我没找到baidu百科的例子,你可以发个链接给我,如果真是这么写的那我给你去修改。2023-07-10 17:58:461
#pragma pack的对齐方式
程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。下面举例说明其用法。#pragma pack(push) //保存对齐状态#pragma pack(4)//设定为4字节对齐struct test{char m1;double m4;int m3;};#pragma pack(pop)//恢复对齐状态以上结构体的大小为16,下面分析其存储情况,首先为m1分配空间,其偏移量为0,满足我们自己设定的对齐方式(4字节对齐),m1大小为1个字节。接着开始为m4分配空间,这时其偏移量为1,需要补足3个字节,这样使偏移量满足为n=4的倍数(因为sizeof(double)大于4),m4占用8个字节。接着为m3分配空间,这时其偏移量为12,满足为4的倍数,m3占用4个字节。这时已经为所有成员变量分配了空间,共分配了16个字节,满足为n的倍数。如果把上面的#pragma pack(4)改为#pragma pack(8),那么我们可以得到结构的大小为24。2023-07-10 17:58:531
谁能详细的介绍一下#pragma region和#pragma endregion关键字
region -- 区域endregion -- 区域结束点使用#pragma region 和 #pragma endregion关键字,来定义可以扩展和收缩的代码区域的开头和结尾。#pragma endregion就可以把这些代码行折叠/收缩为一行,以后要查看其细节时,可以再次扩展它。2023-07-10 17:59:061
32位机器 #pragma pack(4) short d; struct a{short a;short b;short c;} ; sizeof(a)==6 //为什么不为8
属于字节对齐问题。请参考如下文档。2023-07-10 17:59:132
pragma究竟是个啥
pragma是一个预处理指令,会把后面的值传给编译器。 这个预处理指令是用于向编译器提供窗外信息的标准方法。 对于这个指令C标准中没有明确规定,所以不同编译器实现是不同的。 同一个#pragma命令,换一个编译器可能完全没有意义或者是不同意义2023-07-10 17:59:311
C++中的头文件“pragma hdrstop”是什么意思
#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译2023-07-10 17:59:392
keil 程序中#pragma extend是什么意思?
表示允许用关键字“alien”,"near","far",“readonly”来指示数据对象2023-07-10 17:59:472
#pragma once 的具体作用
#pragma once 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次 #pragma once 用来防止某个头文件被多次include,#ifndef,#define,#endif用来防止某个宏被多次定义。2023-07-10 17:59:543
#pragma warning (disable:4200)什么意思?
预处理,不显示4200号警告错误消息: 使用了非标准扩展 : 结构/联合中的零大小数组结构或联合包含的数组大小为零。编译 C++ 文件时为警告等级 2,编译 C 文件时为警告等级 4。示例复制// C4200.cpp// compile with: /W2//#pragma warning (disable:4200) //这句话加在这里#include <stdio.h>struct A {int a[0]; // C4200};int main() {}你可以放在编译器里试试,不加那句话就会出现如下警告:warning C4200: nonstandard extension used : zero-sized array in struct/union而加上那句话之后再编译就不会出现这句警告2023-07-10 18:00:023
显示#pragma warning(disable:4200)什么意思?
1.#pragma warning只对当前文件有效(对于.h,对包含它的cpp也是有效的),而不是是对整个工程的所有文件有效。当该文件编译结束,设置也就失去作用。2.#pragma warning(push) 存储当前报警设置。#pragma warning(push, n) 存储当前报警设置,并设置报警级别为n。n为从1到4的自然数。3.#pragma warning(pop)恢复之前压入堆栈的报警设置。在一对push和pop之间作的任何报警相关设置都将失效。4.#pragma warning(disable: n) 将某个警报置为失效5.#pragma warning(default: n) 将报警置为默认6.某些警告如C4309是从上到下生效的。即文件内#pragma warning从上到下遍历,依次生效。2023-07-10 18:00:101
#pragma warning (disable : 4996)
分类: 电脑/网络 >> 程序设计 >> 其他编程语言 问题描述: 这个是干什么的? 另外还有, #pragma warning (default : 4996) 其他的语句;请求高手给指点指点。 解析: 1.#pragma warning(disable: n) 将某个警报置为失效 2.#pragma warning(default: n) 将报警置为默认 hi.baidu/iceland9/blog/item/5af9c0bfd334de0a18d81f332023-07-10 18:00:171
#pragma comment(lib,"ws2_32.lib")是什么意思
可以参考一下别人的回答:http://zhidao.baidu.com/question/58311804.html2023-07-10 18:00:254
#pragma vector=TIMER0_A1_VECTOR和#pragma vector=TIMERA0_VECTOR
这应该属于嵌入式系统范围。MSP430内部有一个中断向量表,只要往里面对应向量(实际也是某地址)填相应函数的首地址,该中断发生时,就能根据填入的函数首地址自动跳转到该函数。#pragmavector=这句话就是给这个中断向量表进行赋值的。#pragmavector=PORT1_VECTOR表示给这个向量表中的外部端口中断所对应的地址进行赋值,并赋值为函数voidPort_1(void)的首地址。其中,关键字__interrupt则表示这个函数是中断服务函数这种特殊函数。2023-07-10 18:00:321
c语言预处理指令中的#怎么使用
C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境。本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。ANSI标准定义的C语言预处理程序包括下列命令: #define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等。非常明显,所有预处理命令均以符号#开头,下面分别加以介绍。 一 #define 命令#define定义了一个标识符及一个串。在源程序中每次遇到该标识符时,均以定义的串代换它。ANSI标准将标识符定义为宏名,将替换过程称为宏替换。命令的一般形式为: #define identifier string 注意: 1该语句没有分号。在标识符和串之间可以有任意个空格,串一旦开始,仅由一新行结束。 2宏名定义后,即可成为其它宏名定义中的一部分。 3 宏替换仅仅是以文本串代替宏标识符,前提是宏标识符必须独立的识别出来,否则不进行替换。例如: #define XYZ this is a tes 使用宏printf("XYZ");//该段不打印"this is a test"而打印"XYZ"。因为预编译器识别出的是"XYZ" 4如果串长于一行,可以在该行末尾用一反斜杠" "续行。 #defineLONG_STRING"this is a very long string that is used as an example" 5 C语言程序普遍使用大写字母定义标识符。 6 用宏代换代替实在的函数的一大好处是宏替换增加了代码的速度,因为不存在函数调用的开销。但增加速度也有代价:由于重复编码而增加了程序长度。 二 #error 命令#error强迫编译程序停止编译,主要用于程序调试。 #error指令使预处理器发出一条错误消息,该消息包含指令中的文本.这条指令的目的就是在程序崩溃之前能够给出一定的信息。 三 #include 命令#i nclude使编译程序将另一源文件嵌入带有#include的源文件,被读入的源文件必须用双引号或尖括号括起来。例如: #include"stdio.h"或者#include<stdio.h> 这两行代码均使用C编译程序读入并编译用于处理磁盘文件库的子程序。 将文件嵌入#i nclude命令中的文件内是可行的,这种方式称为嵌套的嵌入文件,嵌套层次依赖于具体实现。 如果显式路径名为文件标识符的一部分,则仅在那些子目录中搜索被嵌入文件。否则,如果文件名用双引号括起来,则首先检索当前工作目录。如果未发现文件,则在命令行中说明的所有目录中搜索。如果仍未发现文件,则搜索实现时定义的标准目录。 如果没有显式路径名且文件名被尖括号括起来,则首先在编译命令行中的目录内检索。如果文件没找到,则检索标准目录,不检索当前工作目录。 四 条件编译命令 有几个命令可对程序源代码的各部分有选择地进行编译,该过程称为条件编译。商业软件公司广泛应用条件编译来提供和维护某一程序的许多顾客版本。 #if、#else,#elif及#endif #if的一般含义是如果#if后面的常量表达式为true,则编译它与#endif之间的代码,否则跳过这些代码。命令#endif标识一个#if块的结束。 #if constant-expression statement sequence #endif Eg: #define MAX 91 #include <iostream> using namespace std; int main() { #if MAX > 99 cout<<"MAX is bigger than 99"<<endl; #elif MAX > 90 cout<<"MAX is bigger than 90"<<endl; #else cout<<"MAX is smaller than 90"<<endl; #endif return 0; } 跟在#if后面的表达式在编译时求值,因此它必须仅含常量及已定义过的标识符,不可使用变量。表达式不许含有操作符sizeof(sizeof也是编译时求值)。 #else命令的功能有点象C语言中的else;#else建立另一选择(在#if失败的情况下)。注意,#else属于#if块。 #elif命令意义与ELSE IF 相同,它形成一个if else-if阶梯状语句,可进行多种编译选择。#elif 后跟一个常量表达式。如果表达式为true,则编译其后的代码块,不对其它#elif表达式进行测试。否则,顺序测试下一块。 #if expression statement sequence #elif expression1 statement sequence #endif 在嵌套的条件编译中#endif、#else或#elif与最近#if或#elif匹配。 # ifdef 和# ifndef 条件编译的另一种方法是用#ifdef与#ifndef命令,它们分别表示"如果有定义"及"如果无定义"。# ifdef的一般形式是: # ifdef macroname statement sequence #endif #ifdef与#ifndef可以用于#if、#else,#elif语句中,但必须与一个#endif。 #define MAX 91 #include <iostream> using namespace std; int main() { #ifdef MAX cout<<"hello,MAX!"<<endl; #else cout<<"where is MAX?"<<endl; #endif #ifndef LEO cout<<"LEO is not defined"<<endl; #endif return 0; } 命令#undef 取消其后那个前面已定义过有宏名定义。一般形式为: #undef macroname 命令#line改变__LINE__与__FILE__的内容,它们是在编译程序中预先定义的标识符。命令的基本形式如下: #line number["filename"] 其中的数字为任何正整数,可选的文件名为任意有效文件标识符。行号为源程序中当前行号,文件名为源文件的名字。命令#line主要用于调试及其它特殊应用。注意:在#line后面的数字标识从下一行开始的数字标识。 #line 100 "jia" cout<<"#line change line and filename!"<<endl; //line 100 cout<<__LINE__<<endl; //101 cout<<__FILE__<<endl; //jia 五 #pragma 命令#pragma 为实现时定义的命令,它允许向编译程序传送各种指令。 #pragma的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 其格式一般为: #Pragma Para 1 message 参数。 Message 参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为: #pragma message(“消息文本”) 当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。 当在程序中定义了许多宏来控制源代码版本的时候,自己有可能都会忘记有没有正确的设置这些宏,此时可以用这条指令在编译的时候就进行检查。假设希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法 #ifdef _X86 #pragma message(“_X86 macro activated!”) #endif 当定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_ X86 macro activated!”。就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。 2 code_seg 参数。 格式如: #pragma code_seg( ["section-name"[,"section-class"] ] ) 它能够设置程序中函数代码存放的代码段,当开发驱动程序的时候就会使用到它。 3 #pragma once (比较常用) 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次。这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。 4 #pragma hdrstop 表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。 有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。 5 #pragma resource "*.dfm" 表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体外观的定义。 6 #pragma warning( disable : 4507 34; once : 4385; error : 164 ) 等价于: #pragma warning(disable:4507 34) /* 不显示4507和34号警告信息。如果编译时总是出现4507号警告和34号警告, 而认为肯定不会有错误,可以使用这条指令。*/ #pragma warning(once:4385) // 4385号警告信息仅报告一次 #pragma warning(error:164) // 把164号警告信息作为一个错误。 同时这个pragma warning 也支持如下格式: #pragma warning( push [ ,n ] ) #pragma warning( pop ) 这里n代表一个警告等级(1---4)。 #pragma warning( push )保存所有警告信息的现有的警告状态。 #pragma warning( push, n)保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n。 #pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。例如: #pragma warning( push ) #pragma warning( disable : 4705 ) #pragma warning( disable : 4706 ) #pragma warning( disable : 4707 ) //....... #pragma warning( pop ) 在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。 7 pragma comment(...) 该指令将一个注释记录放入一个对象文件或可执行文件中。 常用的lib关键字,可以帮连入一个库文件。 8 progma pack(n) 指定结构体对齐方式。#pragma pack(n)来设定变量以n字节对齐方式。 n 字节对齐就是说变量存放的起始地址的偏移量有两种情况: 第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式, 第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。 结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数; 否则必须为n的倍数。 下面举例说明其用法。 #pragma pack(push) //保存对齐状态 #pragma pack(4)//设定为4字节对齐 struct test { char m1; double m4; int m3; }; #pragma pack(pop)//恢复对齐状态 为测试该功能,可以使用sizeof()测试结构体的长度!2023-07-10 18:00:521
请问单片机头文件中这句#pragma segment IO=IO_SMTB, locate=0x8是什么意思
字面理解为:告诉编译器本程序的IO类型为IO_SMTB,IO地址为0x82023-07-10 18:01:071
c语言中预处理命令都有哪些?
C语言的预处理主要有三个方面的内容: 1.宏定义; 2.文件包含; 3.条件编译。 预处理命令以符号“#”开头。宏定义命令:#define、#undef,用来定义和解除宏。(值得注意的是还可以定义带参数的宏)文件包含命令:#include "文件名" 或者 #include <文件名>。使用前者时会优先从当前目录查找头文件,使用后者时优先从默认的系统目录查找。条件编译:#ifdef、#else、#endif、#elif 等。出于程序兼容性的考虑,有些语句希望在条件满足时才编译。这时候会用到条件编译的命令。2023-07-10 18:01:174
keil混合编程时,用了#pragma asm和#pragma endasm 也设置相应的选项,可还是出错啊。
你把那个c51s.lib加在工程里面,如果还不行,那么你的软件就有问题了,就得重新下载个了。网上到处都是。2023-07-10 18:01:263
C语言中 #prama pack(1) 是什么呢
意思是把数据对齐到1的倍数,那也就是取消掉对齐了所谓对齐就是安排数据让它的起始地址在一个合适的位置上,避免用2条语句读入数据的情况。比如下面的结构,structa{charc;longl;}c占用了1个字节(第0字节),但是l默认会被安排在4-7字节,整个占用8字节。如果先写了这句pragmapack(1),结果就是c占用第0字节,而l安排在1-4字节,整个占用5字节。虽然省地方,可是读入l就费劲了,得读两次到寄存器,再挪到一起去,要慢不少还有,这个不是c的标准内容而是vc的增加内容。其他编译器也有类似的调整对齐机制,但是是不一样的语法2023-07-10 18:01:331
#pragma once是什么意思
这个是C语言里面的,这是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。#pragma once是编译器相关的,就是说即使这个编译系统上有效,但在其他编译系统也不一定可以,不过现在基本上已经是每个编译器都有这个杂注了。希望能够帮到你,你可以去网页上搜索一下会更加给你讲清楚的。2023-07-10 18:01:411