2017-10-15 6 views
-4

Y a-t-il une différence entre déclarer une fonction comme void et void* dans le cas où je l'utiliserais avec std::thread?Y a-t-il une différence entre déclarer une fonction de thread comme renvoyer void et void *?

void encrypt(/*parameters*/) 
{ 
} 

// ... 

std::thread(encrypt, /*arguments*/); 

Je viens de lire quelque chose sur l'utilisation void* avec des fils sur Internet et je voulais vous assurer que je utilise void et non void* pour une bonne raison. Je souligne généralement tout ce que j'écris beaucoup trop.

+0

Oh, eh bien, je suppose que cette question était une erreur. ¯ \\ _ (ツ) _/¯ – TypicalHog

+0

Je suggère que les downvoters lisent la question et pas seulement le titre. – StoryTeller

Répondre

5

Oui, il y a. Par exemple, cette fonction:

void func() { } 

Est bien formé. D'autre part, celui-ci:

void* func() { } 

Viole une contrainte de langage et est mal formé. La différence? Vous ne pouvez pas omettre l'instruction return, sinon votre programme aura un comportement indéfini. Dans ce cas, le type void* est un type complet, et vous devez donc spécifier une valeur pour la fonction à renvoyer. Dans le contexte std::thread, vous devez le spécifier comme void. Toute valeur de retour est ignorée de toute façon, alors gardez votre programme bien formé sans rien retourner de sens pour le plaisir de le faire.

Si vous lisez des Pthreads en ligne, par hasard, ils attendre un rappel qui à la fois accepte et renvoie void*. C'est ainsi qu'ils pourraient soutenir tout paramètre et tout type de retour. Mais c'est une API C, donc il faut le faire comme ça. L'API C++ idiomatique dans std est sensible au type. Donc, c'est void. Et si vous vous souciez des valeurs de retour, jetez un oeil à std::future.

+0

Merci! Je n'avais aucune idée que cette question déclencherait tant de gens. – TypicalHog

+0

@TypicalHog - Ce n'est pas mal du tout en fait. Je suppose que vous êtes familier avec 'pthreads', où le CB est censé retourner' void * '? – StoryTeller

+0

Je ne suis pas, je viens de lire quelque chose sur l'utilisation de void * avec des discussions sur Internet et je voulais m'assurer que j'utilise void et non pas * pour une raison. Je souligne généralement tout ce que j'écris beaucoup trop. – TypicalHog