構造メンバーフィールドを個別に初期化できないのはなぜですか? ! (USBデバイスドライバから)[閉じる]

構造メンバーフィールドを個別に初期化できないのはなぜですか? ! (USBデバイスドライバから)[閉じる]

USBデバイスドライバを実装しようとしています。私は書いた

#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/usb.h>
struct usb_device_id IDtable[]={  
{USB_DEVICE(0x067b,0x2303)},
{}
};
int ttlprobe(struct usb_interface *interface, const struct usb_device_id *id)
{
    printk(KERN_INFO "Probed (%04X:%04X) device\n", id->idVendor, id->idProduct);
    printk(KERN_INFO "num_altsetting :  %d\n",interface->num_altsetting);
    return 0;
}
void ttldisconnect(struct usb_interface *interface)
{
    printk(KERN_INFO "Device disconnected \n");
}

struct usb_driver busb;
busb.name="guru";
busb.id_table=IDtable;
busb.probe=ttlprobe(&busb,IDtable);
busb.disconnect=ttldisconnect;

int init_module(void){
printk(KERN_ALERT "intimodule exec Trying to register to USB CORE \n");
int k=usb_register(&busb); 
printk(KERN_INFO "retuern value of usb_register_driver : %d\n",k);
pr_info("name    = %s\n", THIS_MODULE->name);
pr_info("name    = %s\n", KBUILD_MODNAME);
return k;
}

void cleanup_module(void){
printk(KERN_ALERT "Trying to de-register to USB CORE");
return usb_deregister(&busb);
}
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anil Kumar Pugalia <email_at_sarika-pugs_dot_com>");
MODULE_DESCRIPTION("USB Pen Registration Driver");

出力は次のとおりです。

make -C /lib/modules/4.10.0-28-generic/build M=/home/guru/Desktop/Linuxx/Drivers/USB/check modules
make[1]: Entering directory '/usr/src/linux-headers-4.10.0-28-generic'
  CC [M]  /home/guru/Desktop/Linuxx/Drivers/USB/check/chc.o
/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.c:20:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
 busb.name="guru";
     ^
/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.c:21:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
 busb.id_table=IDtable;
     ^
/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.c:22:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
 busb.probe=ttlprobe(&busb,IDtable);
     ^
/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.c:23:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
 busb.disconnect=ttldisconnect;
     ^
/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.c: In function ‘init_module’:
/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.c:27:1: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
 int k=usb_register(&busb); 
 ^
scripts/Makefile.build:301: recipe for target '/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.o' failed
make[2]: *** [/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.o] Error 1
Makefile:1524: recipe for target '_module_/home/guru/Desktop/Linuxx/Drivers/USB/check' failed
make[1]: *** [_module_/home/guru/Desktop/Linuxx/Drivers/USB/check] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.10.0-28-generic'
Makefile:4: recipe for target 'all' failed
make: *** [all] Error 2

これが有効な場合、

#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/usb.h>

struct usb_device_id IDtable[]={  // Defined in "/include/linux/mod_devicetable.h" which is *included* into "linux/usb.h"
{USB_DEVICE(0x067b,0x2303)},
{}
};

int ttlprobe(struct usb_interface *interface, const struct usb_device_id *id)
{
 printk(KERN_INFO "Probed (%04X:%04X) device\n", id->idVendor, id->idProduct);
printk(KERN_INFO "num_altsetting :  %d\n",interface->num_altsetting);


return 0;
}
void ttldisconnect(struct usb_interface *interface)
{
printk(KERN_INFO "Device disconnected \n");
}

struct usb_driver DetectingUSB={        // Defined in /include/linux/usb.h
.name="USBtoTTL",
.id_table=IDtable,
.probe=ttlprobe, 
.disconnect=ttldisconnect,
};


int init_module(void){
printk(KERN_ALERT "intimodule exec Trying to register to USB CORE \n");
int k=usb_register(&DetectingUSB); 


printk(KERN_INFO "retuern value of usb_register_driver : %d\n",k);
pr_info("name    = %s\n", THIS_MODULE->name);
pr_info("name    = %s\n", KBUILD_MODNAME);
return k;
}

void cleanup_module(void){
printk(KERN_ALERT "Trying to de-register to USB CORE");
return usb_deregister(&DetectingUSB);
}
MODULE_LICENSE("GPL");

メンバーフィールドを個別に初期化できないのはなぜですか? !

答え1

関数の外部では、この方法でフィールドメンバーを初期化することはできません。本当にこれを行うには、初期化コードをinit_module関数の内部に移動する必要があります。

また、

busb.probe=ttlprobe(&busb,IDtable);

関数への予想ポインタの代わりにttlprobe(&busb, IDtable)結果を割り当てます。probe

初期化ブロックを使用します。これがここで予想されるものです。

関連情報