Comment utiliser VC++ fonctions intrinsèques w/o bibliothèque run-time

Je suis impliqué dans l'un de ces défis où vous essayez de produire la plus petite possible binaire, donc je suis en train de construire mon programme sans le C ou C++ bibliothèques d'exécution (RTL). Je n'ai pas de lien pour la version de la DLL ou la version statique. Je n'ai même pas #include les fichiers d'en-tête. J'ai ce travail très bien.

Certains RTL fonctions, comme memset(), peut être utile, j'ai donc essayé d'ajouter mon propre mise en œuvre. Il fonctionne très bien dans les versions Debug (même pour les lieux où le compilateur génère une implicite appel à memset()). Mais dans les versions Release, j'obtiens un message d'erreur disant que je ne peut pas définir une fonction intrinsèque. Vous voyez, dans les versions Release, intrinsèque fonctions sont activées, et memset() est intrinsèque.

J'aimerais utiliser la valeur intrinsèque pour memset() dans ma version s'appuie, depuis c'est probablement incorporé et plus petit et plus rapide que ma mise en œuvre. Mais il me semble être dans un catch-22. Si je ne définissent pas memset(), l'éditeur de liens se plaint qu'il est indéfini. Si je ne le définir, le compilateur se plaint que je ne peut pas définir une fonction intrinsèque.

Personne ne sait la bonne combinaison de définition, déclaration, #pragma, et le compilateur et l'éditeur de liens indicateurs pour obtenir une fonction intrinsèque sans tirer à RTL le dessus?

Visual Studio 2008, x86, Windows XP+.

À rendre le problème un peu plus concret:

extern "C" void * __cdecl memset(void *, int, size_t);

#ifdef IMPLEMENT_MEMSET
void * __cdecl memset(void *pTarget, int value, size_t cbTarget) {
    char *p = reinterpret_cast<char *>(pTarget);
    while (cbTarget > 0) {
        *p++ = static_cast<char>(value);
        --cbTarget;
    }
    return pTarget;
}
#endif

struct MyStruct {
    int foo[10];
    int bar;
};

int main() {
    MyStruct blah;
    memset(&blah, 0, sizeof(blah));
    return blah.bar;
}

Et je accumulation de ce genre:

cl /c /W4 /WX /GL /Ob2 /Oi /Oy /Gs- /GF /Gy intrinsic.cpp
link /SUBSYSTEM:CONSOLE /LTCG /DEBUG /NODEFAULTLIB /ENTRY:main intrinsic.obj

Si je compile avec ma mise en œuvre de memset(), j'obtiens une erreur de compilateur:

error C2169: 'memset' : intrinsic function, cannot be defined

Si je compile sans ma mise en œuvre de memset(), j'obtiens une erreur de l'éditeur de liens:

error LNK2001: unresolved external symbol _memset
  • C'est /GL c'est ça le problème, voir ma réponse ci-dessous.