C/C++语言基础_static,const,sizeof

Static关键字有什么作用(列举三条以上)

1.函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。
2.在模块内的static全局变量可以被模块内的所有函数访问,但不能被模块外的其他函数访问。
3.在模块内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内。
4.在类中的static成员变量属于整个类所有,对类的所有对象只要有一份复制。
5.在类中的static成员变量属于整个类所有,这个函数不接收this指针,因而只能访问类的static成员变量。
范例:
#include<stdio.h>
int sum(int a)
{
     int c=0;
     static int b=3;
     c+=1;
     b+=2;
     return (a+b+c);
}
void main()
{
     int i=0;
     int a=2;
     for(i=0;i<5;i++)
        {
             printf("d%,",sum(a));
        }
}
分析:这里静态局部变量b的生存周期为整个程序,每次调用函数sum()时,静态局部变量b都保存了前次被调用后留下的值。每次调用sum()函数时,a和c的值都没变,只有b的值每次加2,则第一次输出8,第二次输出10,输出结果依次递增2。

const关键字有什么作用?

1.欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对他进行初始化,因为以后就没有机会再去改变他了。
2.对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或者二者同时为const。
3.在一个函数声明中,const可以修饰形参,表明他是一个输入参数,在函数内部不能改变其值。
4.对于类成员函数,若指定其为const类型,则表明是一个常量函数,不能修改类的成员变量。
5.对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为左值。

请说出const与#define相比有何优点

1.const修饰的只读变量具有特定的类型,而宏没有数据类型。编译器可以对前者进行类型安全检查,而对后者只能进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。
2.有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
3.编译器通常不为普通的const只读变量分配存储空间,而是将它们保存在符号表中,这使得他成为一个编译期间的值,没有了存储与读内存的操作,使得他的效率也很高。

sizeof的使用
int i=0;
下面哪个不能运行出结果()?
A.sizeof(int)            B.sizeof(i)            C.sizeof  int              D.sizeof i

       sizeof表示的是计算对象所占内存空间的大小,大多数人根据他的形式sizeof()认为sizeof是函数,实际上他只是关键字并非函数,D选项运行结果证明了它不是函数。
另外,需要注意的是,sizeof在计算变量所占空间大小的时候,括号是可以省略的(一般人我都不告诉他),而在计算类型(模子)大小时括号则不能省略,故A,B,D都将显示4.

1.1


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Linux上,使用DBus传递文件句柄需要以下步骤: 1. 定义DBus消息的格式,包含传递文件句柄的FD(File Descriptor)类型。 2. 在发送方进程中打开文件,并将文件句柄通过DBus消息发送给接收方进程。 3. 在接收方进程中接收DBus消息,并从消息中获取文件句柄。 4. 使用文件句柄进行文件操作,并在使用完成后关闭文件句柄。 以下是一个简单的C++代码示例,演示了如何使用DBus传递文件句柄: ```cpp #include <iostream> #include <dbus/dbus.h> #include <fcntl.h> #include <unistd.h> using namespace std; // 定义DBus消息的格式 static const char* DBUS_MSG_PATH = "/com/example/Test"; static const char* DBUS_MSG_INTERFACE = "com.example.TestInterface"; static const char* DBUS_MSG_NAME = "TestMessage"; static const char* DBUS_MSG_CONTENT = "This is a test message."; // 定义文件路径 static const char* FILE_PATH = "/tmp/test.txt"; int main() { // 初始化DBus连接 DBusError error; dbus_error_init(&error); DBusConnection* dbus_conn = dbus_bus_get(DBUS_BUS_SESSION, &error); if (dbus_error_is_set(&error)) { cerr << "DBus Connection Error: " << error.message << endl; dbus_error_free(&error); return 1; } // 创建DBus消息 DBusMessage* dbus_msg = dbus_message_new_signal(DBUS_MSG_PATH, DBUS_MSG_INTERFACE, DBUS_MSG_NAME); if (!dbus_msg) { cerr << "DBus Message Error: Failed to create dbus message." << endl; return 1; } // 打开文件并获取文件句柄 int fd = open(FILE_PATH, O_RDONLY); if (fd < 0) { cerr << "File Error: Failed to open file." << endl; return 1; } // 将文件句柄添加到DBus消息中 dbus_bool_t dbus_ret; dbus_ret = dbus_message_append_args(dbus_msg, DBUS_TYPE_UNIX_FD, &fd, DBUS_TYPE_INVALID); if (!dbus_ret) { cerr << "DBus Message Error: Failed to append file descriptor to dbus message." << endl; return 1; } // 发送DBus消息 dbus_ret = dbus_connection_send(dbus_conn, dbus_msg, NULL); if (!dbus_ret) { cerr << "DBus Connection Error: Failed to send dbus message." << endl; return 1; } // 等待DBus消息发送完成 dbus_connection_flush(dbus_conn); // 关闭文件句柄 close(fd); // 释放DBus消息和DBus连接 dbus_message_unref(dbus_msg); dbus_connection_unref(dbus_conn); return 0; } ``` 在接收方进程中,可以通过DBus回调函数接收DBus消息,并从消息中获取文件句柄。以下是一个简单的DBus回调函数示例: ```cpp #include <iostream> #include <dbus/dbus.h> #include <fcntl.h> #include <unistd.h> using namespace std; // 定义DBus消息的格式 static const char* DBUS_MSG_PATH = "/com/example/Test"; static const char* DBUS_MSG_INTERFACE = "com.example.TestInterface"; static const char* DBUS_MSG_NAME = "TestMessage"; static const char* DBUS_MSG_CONTENT = "This is a test message."; // 定义文件路径 static const char* FILE_PATH = "/tmp/test.txt"; // 定义DBus回调函数 DBusHandlerResult dbus_callback(DBusConnection* dbus_conn, DBusMessage* dbus_msg, void* user_data) { if (!dbus_msg) { return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } // 获取DBus消息的类型和名称 const char* dbus_msg_type = dbus_message_type_to_string(dbus_message_get_type(dbus_msg)); const char* dbus_msg_name = dbus_message_get_member(dbus_msg); if (strcmp(dbus_msg_type, "signal") == 0 && strcmp(dbus_msg_name, DBUS_MSG_NAME) == 0) { // 从DBus消息中获取文件句柄 int fd; if (!dbus_message_get_args(dbus_msg, NULL, DBUS_TYPE_UNIX_FD, &fd, DBUS_TYPE_INVALID)) { cerr << "DBus Message Error: Failed to get arguments from dbus message." << endl; return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } // 读取文件内容 char buffer[1024]; int nread = read(fd, buffer, sizeof(buffer)); if (nread < 0) { cerr << "File Error: Failed to read file." << endl; return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } // 输出文件内容 cout << "File Content: " << buffer << endl; // 关闭文件句柄 close(fd); return DBUS_HANDLER_RESULT_HANDLED; } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } int main() { // 初始化DBus连接 DBusError error; dbus_error_init(&error); DBusConnection* dbus_conn = dbus_bus_get(DBUS_BUS_SESSION, &error); if (dbus_error_is_set(&error)) { cerr << "DBus Connection Error: " << error.message << endl; dbus_error_free(&error); return 1; } // 注册DBus回调函数 dbus_bus_add_match(dbus_conn, "type='signal',interface='" DBUS_MSG_INTERFACE "',member='" DBUS_MSG_NAME "'", &error); dbus_connection_add_filter(dbus_conn, dbus_callback, NULL, NULL); // 进入DBus消息循环 while (dbus_connection_read_write_dispatch(dbus_conn, -1)) {} // 释放DBus连接 dbus_connection_unref(dbus_conn); return 0; } ``` 需要注意的是,DBus传递文件句柄需要在DBus连接中启用FD_PASSING选项,并且DBus库的版本需要在1.9.8以上。在C语言中,可以使用dbus_connection_set_max_message_size()函数设置DBus消息的最大长度,以避免DBus消息过长导致传递文件句柄失败。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值